Because macro arguments aren't expanded when they are "stringified", but they are (fully) expanded when they're used as an argument to another macro, per the argument prescan rules.
Edit:
To answer the title question, no, there is no better way -- that approach is idiomatic, and you must use at least 2 macros no matter what you do.