It's so that parsing can be done before everything else, instead of having to mix it with evaluation like in C++ (which doesn't even have macros, aside from the preprocessor, but as a consequence of weird syntax choices, parsing it is undecidable!).
It's actually a good thing, since it makes macros much easier to write (you don't need to parse the syntax yourself like in Rust) and easier to use (you can apply what you know about Nim syntax, such as being able to write foo bar, baz instead of foo(bar, baz). And Nim's syntax is very flexible, so you can do many things with it, as long as they vaguely look like Nim.
One of the current limitations is that you can't create custom type definitions (e.g. if you want to add true sum types, you can't make it type Foo = sum, but it will have to be sumType foo:, which creates an inconsistency). I think the syntax could be made more flexible in this regard, but definitely not by allowing macros to be passed arbitrary text. And as you mention, it doesn't decrease the power of macros.