Caveats of using the nullish coalescing operator (??) to check for the existence of a key in an object?

The risks you are talking about are irrelevant when you know what kind of object to expect, in your particular case one with a bar property. There is no Object.prototype.bar.

The "risks" of using ?? after a property access are exactly the same as the risks of doing the property access. Your statement let a = foo.bar ?? 'default'; is equivalent to

let a = foo.bar == null ? 'default' : foo.bar;

or (without accessing the property twice)

let a = foo.bar;
if (a == null) a = 'default';