Я не понимаю, почему вывод равен 456. Я думаю, что b в [b] является свойством объекта, а c является другим свойством a. Они не связаны с var b и c вообще. Но почему a.c переопределяет a.b?
var a={},
b={key:'b'},
c={key:'c'};
a[b]=123;
a[c]=456;
console.log(a[b] === 456); //true