For readability and understanding, I would swap the logic. When you check if values are different it's not clear - all values should be different (consider integer values 1, 2, 3), or values could be equal, but there is at least one different value (1, 2, 1)? When you check if all values are equal it's always clear.
And I would extract this logic to the nicely named method (you can even make it generic if you want):
public static bool AllEqual(params bool[] values)
{
if (values.Length == 0)
return true;
var first = values[0];
for (int i = 1; i < values.Length; i++)
if (values[i] != first)
return false;
return true;
}
And usage
var notAllEqual = !AllEqual(value1, value2, value3, value4);
With declarative approach your code describes what you are doing instead of telling how and leaving the reader on its own to understand what.
Update: If you always deal with four boolean values, the simplest way to check if they are not all equal is
(value1 ^ value2) || (value2 ^ value3) || (value3 ^ value4)
But in terms of readability, any imperative approach is worse than declarative