You're correct that an explicit access-own syntax like foo:bar could solve part of the problem. As part of my design process I considered a solution like that at some length, so I'm happy to discuss the details of it!
To have parity with what this proposal suggests, that foo:bar would also need to forbid getter invocation. If you did that you'd at least have the security-hole side fairly well covered.
What a new record accessor syntax wouldn't do is create a clear notion of deep equality. This proposal at least makes it clear how you would implement recordsDeepEqual so that it could be implemented in library-space. A proper composites proposal could still follow on, creating a mechanism by which Map and Set could trigger structural equality behavior instead of reference equality behavior.
As for where it makes a big difference, in a word, validation.
let validNodes = new WeakMap();
let nodeFactory = (childNodes) => {
if (!Object.isDeepRecord(childNodes)) throw new Error();
for (let i = 0; i < childNodes.length; i++) {
if (!validNodes.has(childNodes[i])) throw new Error();
}
let node = Object.freezeRecord({ childNodes });
// We can only cache validity for deep immutable structures
validNodes.add(node);
return node;
};
Finally I don't contribute to TC39 just out of the goodness of my heart. I'm giving so much time to honing this proposal because I need it urgently. With a new syntax I'd have to either wait years or change every foo.bar to recordGetAt(foo, 'bar'). Neither of those options is attractive to me.