Why NRVO is not applied here?
If this purely a curiosity of yours, and you want to know how VC10 algorithmically decides whether or not to perform NRVO, then the only people who could answer this question reliably are those who know how VC10 works internally - those who wrote it.
For what I can tell, according to the C++11 Standard the compiler is allowed to perform NRVO in this situation, and not doing so is just a compiler's decision - not due to any validity constraint. Per Paragraph 12.8/31:
[...] This elision of copy/move operations, called copy elision, is permitted in the following circumstances (which
may be combined to eliminate multiple copies):
— in a return statement in a function with a class return type, when the expression is the name of a
non-volatile automatic object (other than a function or catch-clause parameter) with the same cv-unqualified
type as the function return type, the copy/move operation can be omitted by constructing
the automatic object directly into the function’s return value
[...]
However, if you are asking with the expectation that you should be able to force your compiler to perform NRVO, then the answer is "You cannot".
It is completely at a compiler's discretion whether or not to apply NRVO. You cannot count on it, and you cannot count on it not being performed. This is, to the best of my knowledge, the only exception to the so-called "as-if" rule.
This said, chances to get NRVO being performed increase as you increase the level of optimization.