В первом случае объект == объект это то же самое что строгое сравнение ===.
Во втором случае справа arr приводится к boolean, пустой массив это true, потом НЕ приводит его к false.
Получаем arr == false.
Далее абстрактное сравнение в случае если слева object а справа boolean приводит типы так - ToPrimitive(A) == ToNumber(B). В случае с ToPrimitive массива без preferredType очерёдность вызовов "valueOf" -> "toString", valueOf у массива возвращает массив, это не примтив, поэтому используется toString. toString у пустого массива возвращает пустую строку. ToNumber на false это 0.
Получаем "" == 0
Абстрактное сравнение string с number подразумевает операцию над строкой ToNumber, пустая строка приведённая к числу это 0
Получаем 0 == 0, что то же самое что 0 === 0.