That's moving the goal posts. The important thing is that macro invocations can be found "statically" (with out knowing the implementations of macros at all let alone evaluating).
One way to look at this is that partial evaluation of Rust or Scheme macros is very tractable, because there are very few side effects / side channels. But if you have a lack of hygiene or the C preprocessor, it's very difficult and almost everything becomes a "stuck term" whose evaluation is contingent on earlier evaluation.
That's true about the pure act of parsing and generating an AST. Bit once we want to do semantic analysis, this is no longer true.
Because of procedural macro, it becomes practically impossible to find all occurrences or rename a particular symbol regardless of the #ifdef or #[cfg] or whatever.
So with true hygienic macros, this is not the case. Even with procedural macros, quoted identifiers are resolved where they are quoted not where they are expanded. Identifiers that are not in scope at the macro definition site would have to be parameters, and those are caught at the invocation site just like any other identifier (the quote and splice cancel out).
I am not sure whether Rust procedural macros are always that hygienic, so fair point if they aren't.