На самом деле все немного сложнее.
У объектов нет никакого свойства __proto__. Есть внутреннее, недоступное из программ свойство [[Prototype]]. А __proto__ это getter/setter из Object.prototype - системные функции JS, которые могут получать/менять [[Prototype]] объектов. Они доступны из объектов через цепочку прототипов. Если она не нарушена.
let op = {
x: 1,
y: 2
};
let o ={};
o.__proto__ = op;
console.log (o.__proto__); // {x:1, y:2} здесь идет обращение к Object.prototype get __proto__
console.log (o.x, o.y); // 1 2 это из прототипа
o.__proto__ = null;
console.log (o.x, o.y); // undefined undefined т.к. нет прототипа
o.__proto__ = op;
console.log (o.__proto__) // по прежнему {x:1, y:2} но это не прототип! это обычное свойство __proto__
console.log (o.x, o.y); // и по прежнему undefined undefined т.к. нет прототипа. И никогда не будет.
Написав o.__proto__ = null, мы нарушили цепочку прототипов. Из нашего объекта теперь невозможно добраться до Object.prototype и нет доступа к setter __proto__. Поэтому, когда мы снова пишем o.__proto__ = op, то не меняем прототип [[Prototype]], а просто создаем обычное свойство с именем __proto__. Оно ссылается на op, но это не имеет никакого отношения к прототипу объекта