У вас перепутано немного. Объект user1 имеет переопределение функции valueOf, которая вызывается. при преобразовании в число. А user2 переопределение toString, которая вызывается при преобразовании в строку.
При `${A}` будет вызываться toString, а при +A будет valueOf (или если его нет, то toString)
console.log(`${user2}`); // Выведет 20 10, т.к. будет вызов user2.toString()
console.log(+user1); // Выведет 20 10 т.к. будет вызов user1.valueOf();
console.log(+user2); // Вывезет 20 10, у user2 нет valueOf, будет произведен вызов функции toString, результат которой будет преобразован в число.
Во втором случае у вас сработало потому, что в +user2 сначала смотрится valueOf, если его нет, используется toString. В первом же случае используется только toString, а у вас эта функция не переопределена.
А значение с __proto__ не будет меняться, т.к. вы его и не меняли, у вас же user1.__proto__ === Object.prototype