"hello world"s is, since C++11, a single preprocessing token matching the user-defined-string-literal grammar production.
Macros substitute on the level of preprocessing tokens. Since there is no s preprocessing token, there can't be any substitution of your macro.
As a result your code is well-formed in C++14 or later. std::operator""s is chosen. In C++11 there was no std::operator""s.
However, before C++11 when user-defined literals were introduced, "hello world"s would have been two preprocessing tokens "hello" and s, so the latter one would have been substituted with your macro.
This is even explicitly mentioned in [diff.cpp03.lex]/2 as a backwards-incompatible change with C++11.