it will actually instantiate a new temporary object whenever a method is called
Well, yes, that's how method calls on primitive values are specified. However, it is used only to explain the behaviour (as it's a simple way to describe how the lookup of properties should end up on the native prototypes), not to tell how it is actually implemented (a static acess to String.prototype, no temporary object involved).
Why is a string-literal faster than a String-object?
So what does an engine do with string literals? They're constants. Their type is known. A property access - we know what happens. Wait, does anyone do anything with the results? Why call a side-effect free function at all?
You see where this leads to: optimisation. Don't be fooled by the compiler on microbenchmarks.