It is the magic of objc_retainAutoreleaseReturnValue. If the autoreleased object is going to be immediately retained by the caller then it is not autoreleased - so it would not show up in the autorelease pool. I brought up the assembly assistant window and see the call to objc_retainAutoreleaseReturnValue just after the call to obj_msgSend for the [NSMutableString string] call.
See this blog post for more information. It references comments in Apple code that says:
objc_autoreleaseReturnValue() examines the caller's instructions
following the return. If the caller's instructions immediately call
objc_autoreleaseReturnValue, then the callee omits the -autorelease
and saves the result in thread-local storage. If the caller does not
look like it cooperates, then the callee calls -autorelease as
usual.
objc_autoreleaseReturnValue checks if the returned value is the same
as the one in thread-local storage. If it is, the value is used
directly. If not, the value is assumed to be truly autoreleased and
is retained again. In either case, the caller now has a retained
reference to the value.
Tagged pointer objects do participate in the fast autorelease
scheme, because it saves message sends. They are not entered in the
autorelease pool in the slow case.