Why is it necessary to halt program execution for the breakpoint to be effective?
The fact that exchanging steps 3 and 4 doesn't work (doesn't break the program) suggests that operation 3 has the effect of clearing the hardware breakpoints, and that a "trivial" interaction between the debugger and the program has the effect of re-installing the breakpoints.

If in your environment you don't have a way to load the program in a halted state, and then install breakpoints and start it, and if you need this in order to debug something which happens unconditionally, early in the execution, you might be able to insert some kind of software breakpoint into the program, in code which executes even earlier than the situation you're trying to debug.