i have no idea what you mean about colons, but macros are evalueted outside-in.
and spam expect to receive spam: { $($t:tt)* }, and super_spam!(spam) doesn't fit that expectation.
you might find this weird, as values in functions are avaluated inside out, but it's necessary to make macros able to absorb arbitrary code that may itself contain macros
here is an example that works. as you can see spam is evaluated first, and makes 3 inner_spam, and the the 3 get evaluated. concat! does allow macros to be evaluated before doing the actual concatenation, making it kinda special, which is why it is a compiler builtin