> binding a VC’s text signal to a property on the VM just to avoid creating an action in the VC

That's a nice side effect, but not the _reason_ to do it.

The important part is that the view model should be able to conditionally enable/disable the action. In the case of a login form, the view model might wish to disable the action if the username has not been entered yet. To do that, it needs access to the username string.

Though a property _is_ technically "state," it's not gross if only ever treated like a signal (bound to and observed). You could even model it that way if desired, though losing some type information along the way.