I understand from your post that my state machine Hold0 is in a loop in loop() so serial.available() is able to keep being .... available... Probably what I need to do then is move EXEC(Hold0) out of the loop() and into setup(), but give it its own loop to read characters. What is the best way to do that? giving it a loop to allow reading multiple characters from serial?
No, you misunderstood me. The EXEC(Hold0) is not that wrong in the loop() but having only that state machine being called in the loop you must never call it's Finish() method. EXEC() is not being called once and then the state machine runs "itself" but it's designed to be called repeatedly, it's the working horse of the state machine. I got the impression from your code that you thought that you call EXEC(Strike) and then that state machine is running in a kind of "background" task/process, so you can end the Hold0 state machine. This is not the case. An Arduino doesn't have an operating system that is taking care of processes and background tasks. It does run through our program, the only exception are the interrupts but that's more a hardware thing.
Each of your state machines have only one state and that's where I think is your conceptional error.
Maybe you should describe what your whole program is expected to do.