Optimization decisions that V8 team have made are much more universal than it might seem.
It is true there are sometimes strange artificial corner cases - but those are often either bugs or temporary solutions that are going to be replaced with something more generic as soon as they start to hurt too much code.
> which ends up with having to jump through some hoops in a for-in loop
Could you clarify which hoops precisely do you need to jump through?
I am not sure I can imagine a reasonable chunk of code that strives to be both fast, well written and wants to use a context captured or global for-in variable.
for (IWantThisVariableToEndUpOnGlobalObject in obj) { }
How often do you write code like this?