Эти числа интерпретируются как десятичные числа.
Попробуйте:
console.log(parseInt("1100", 2) ^ parseInt("1001", 2))
Конечно, ответ (0101) печатается в десятичном виде (5).
Грамматика токенов JavaScript поддерживает числа в десятичном, восьмеричном и шестнадцатеричном виде, но не в двоичном виде.Таким образом:
console.log(0xC0 ^ 0x09)
Кстати, первый сработал, потому что 1100 (десятичное) это 1101 (десятичное) после xor с 1.