Теперь в вашем случае C.prototype и a[[prototype]] изначально ссылаются на один и тот же объект, затем вы полностью меняете C.prototype на другой объект (в памяти), но ссылка a[[prototype]] по-прежнему указывает на старый.

Итак, вы думаете, что изменили тот же объект, но на самом деле вы только что создали совершенно новую ссылку, выполнив новое присваивание.

Чтобы они указывали на один и тот же объект в памяти, просто сделайте следующее:

Object.setPrototypeOf(a, C.prototype); // thats like a[[prototype]] = C.prototype