Почему при обращении по ключу объекта, который сам (ключ) является объектом, всегда возвращается значение последнего ключа?
Ключи объектов - это строки, дефолтное строковое представление объекта - это "[object Object]". Всё.

Хотите, чтобы объект реально был ключом - вместо простого объекта используйте Map.
У объектов ключами могут быть только строки => при использовании другого объекта в качестве ключа, он будет преобразован в строку. 
В результате преобразования объекта в строку, ключом someObject будет "[object Object]"

const a = {
  foo: 'bar'
};

const b = {
  bar: 'baz'
};

const someObject = {
  [a]: 1,   //  т.к. a - объект, у него вызовется метод Object.prototype.toString() и ключом станет "[object Object]"
  [b]: 2,   // аналогично ключом будет "[object Object]"
}

// Т.к. a - объект, то он преобразуется в строку и получаем значение 
// someObject["[object Object]"] = 2
console.log(someObject[a]) // 2

В итоге, вначале устанавливаем someObject["[object Object]"] = 1, а потом изменяем его на someObject["[object Object]"] = 2

Также есть струтура данных Map, ключами которой могут быть не только строки.