It appears that when you have multiple devices receiving notifications, and simply uncheck the option to speak, without removing the individual devices from the speech menu, they continue to speak, regardless.
The solution is to re-enable speech, then manually remove each speech device, then un-toggle the overall speech option. Definitely seems like a bug, since the output/action does not match the UI.
Tagging @bravenel, assuming you're talking about the "Send or speak a message" action in Rule Machine (didn't test this myself since I apparently don't have any TTS devices on my test hub, but I could easily see how this happens if RM just checks for selected speech devices without seeing if that option is enabled).
That being said, a good piece of advice for Rule Machine--or really any app with "dynamic" pages (where the contents change as you choose different options)--is to undo things from the bottom up, un-selecting or removing the last thing you added before going farther up and disabling or removing the option/action. This will also help avoid things like phantom "In use by" references on device pages, though I think a lot of those cases were addressed in a recent update (though unlike this, those don't really have any impact). Not saying this isn't a problem, just offering a tip on how to avoid odd cases like this in lots of apps, though I'm sure the knowledge is appreciated if it uncovers a bug.
You are correct in your assumptions of what function I'm using. Yeah, in the early days of RM, I was much more careful about the bottom-up stuff. But in the last year it really seems to have improved to the point where I'm shocked when something doesn't work as the GUI shows it. Just wanted to let y'all know I encountered this.