You either wait a short time before sending another command (which would be the normal case anyway) or have a third handshaking line.
I don't understand this bit about waiting and handshaking.
If I want to implement a CNC-like interface with one line being direction, and the other line being pulses (motor steps), why couldn't I just have the slave-board ISR set a boolean that a pulse had occurred, and then in my slave-board program loop I can check that boolean and step the motor one step if it's true, then set it back to false?
There is a risk that pulses could come quicker than my program loop could step the motor in which case I would 'lose steps', but the only solution for that would be to reduce the pulse frequency from the master arduino...is that what you meant by 'wait a short while before sending another command'?
The stepper motors I'm trying to drive are 50,000 steps per revolution, so speed is rather important.