I'm pretty familiar with Scala. I work at a Scala shop.
We have lots of passes that decision off of the coding convention:
https://github.com/google/closure-compiler/blob/master/src/com/google/javascript/jscomp/RenameProperties.java#L336 - I'd be highly surprised if yours truly was null.
If you just use standard property renaming, then you are correct: the more externs you have the less property renaming. However, the standard build of the compiler enables type based optimizations. We have multiple optimization passes that use type information. A compiler will rename a property on an object, even if that property name exists on an extern, provided it can determine the two are not related. But if you aren't currently passing type information to the compiler, you won't be able to take advantage of any of that.
The other effect you are seeing is potentially one of the back-off strategies of property renaming. At least in some cases if the compiler sees o['Foo'], it won't rename o.Foo as that is a common mistake. Of course the quoted property has to be a string literal for that to function.
To sum up though, the only supported way to block renaming is to have an extern with that property, or to quote the property. Using anything else would be depending on an internal feature of the compiler that could change at any time.
Chad Killingsworth