The hz is not replaced because expressionForm does not have hz in it until it is evaluated (which is too late because the With tried to replace the value first)
You can always do this if you need it in a block/module/with type construct:
Your solution with “/.” is good for my specific example, but I’m left curious why Block doesn’t work in my attempt (as an exercise while I’m trying to learn the Wolfram language.) Block does work with an arbitrary function in place of Play:
My previous success using Block is why I was surprised when it didn’t work with Play. Ideally I’d like to be able to predict ahead of time when I need to use “/.” instead of Block, but I haven’t yet grasped the principle at play here.