if (arr[0] == arr[1] == arr[2])
Результат выполнения операции == в С++ -- это bool, а bool конвертируется в int.
Запись в скобках эквивалентна (a[0] == a[1]) == a[2] и сравнивает a[2] с результатом сравнения a[0] и a[1] (0 если они не равны, 1 если равны). Т.е. 1 == 1 == 1 -- это истина, поскольку (1 == 1) -- истина, истина сконвертированная в int -- это 1, а 1 == 1 -- это истина.
почему сравнение значений массива по индексу работает не так, как с обычными переменными
Точно так же оно работает.
как мне добиться нужного результата?
if (arr[0] == arr[1] && arr[1] == arr[2])