There's an observable difference with your getter based approach and the "normal property values" approach in the article:
const t = new Translation
// property value that
// is initialized once
t.translations === t.translations
// getters which return
// new objects
t.translations !== t.translations
so at the very least the browser can't optimize that behavior away, it needs to create new objects. Besides, ensuring that say, call to `Object.keys` is side-effect free is challenging.