Почему this ведет себя по разному при сравнении с числом?
Когда вы пытаетесь обратится к свойству/методу примитивного типа, он оборачивается в объект (Number, String и.т.д.), выполняется ваш метод или возвращается свойство, после чего объект удаляется. Поэтому в this у методов всегда будет ссылка на "объект обертка". Этот какlet num = new Number(123);
num === 123; // false
num == 123; // true
typeof num; // object
UPD: в строгом режиме, this внутри метода будет примитивным типом number. Почему это так, пока не знаю, не могу найти в спецификации такого. Вероятно это потому, что в строгом режиме this не преобразуется автоматически (например в не строгом режиме, с null/undefined в глобальный объект). Пример// не строгий режим
function func() {
	console.warn(this);
}

func.call(100); // выведет [Number: 100] объект, т.е. есть преобразование
строгий"use strict"

function func() {
	console.warn(this);
}

func.call(100); // выведет 100, примитивный number. т.е. преобразования нет
Поэтому код и работает в  вашей песочнице, т.к. там строгий режим включен по умолчанию.
Очевидно, в первом случае typeof this != 'number'.Number.prototype.x = function(){ return Number(this) === 123; };
(123).x();  // return true