What if you try ${Node.Caption}?
Also, I would be curious to know if ${NodeName} is actually looking at the SysName column in the DB, and if this field is populated for the devices in question. I've seen the "test alert" function do some funky stuff, so I don't completely trust it.
You may also want to try just ${Caption}. I'm not sure you actually need to specify the table.
Can you export the alert def to a file and post it here?
Thats odd. I created a new alert that triggers when the CPU utilization is greater than 1 on a device matching a particular custom property in our environment while using your trigger action (with my email address), and it worked. Actually, it named the device 3 times; once for each of the variables. Also, it put the "%" in there twice, as it is actually included in the value of the vaiable.
Have you tried to just blow this one away and recreate it?