Hey Simon -
What you are describing ought to work. I conducted tests just the other day in which my GeoEvent Definition had fields 'CodedName' and 'CodedValue' and I sent multiple SMS messages: Message to {$CodedName}: ${CodedValue}
We've never referred to these as "macros", but that's kind of like what they are. The ${FieldName} gets expanded in-line to the value contained in that field. The field names are case sensitive.
What are you seeing in the SMS you receive? Can you screenshot the entire sms-text-out connector configuration as well as your GeoEvent Definition? Have you tried running the output to a TCP text output to confirm which GeoEvent Definition is being used to handle the event's attribute values? Do you, by chance, have more than one SMTP dependent output connector configured? The "?Send a text message"? and "?Send an email"? output connectors both rely on SMTP...
/RJ