Early humanoid robots moved in a careful shuffle, knees permanently bent, feet flat. That gait was not a limitation of the motors. It came from the control strategy.
Staying inside the footprint
The classical approach keeps a quantity called the zero moment point — roughly, the spot where the ground reaction force acts — inside the polygon covered by the feet at all times. Do that, and the robot is statically stable at every instant. Push it slightly and it recovers.
It also means the robot can never let itself fall, and human walking is a controlled fall. Each step begins by allowing the body to topple forward and ends by catching it. Forbid the topple and you forbid the gait.
Predicting instead of reacting
The change came from model-predictive control. Rather than enforcing stability instant by instant, the controller runs a simplified physical model of the robot forward over the next second or two, solves for a sequence of foot placements and forces that keeps the whole trajectory viable, executes the first fraction of it, then re-solves. Hundreds of times a second.
Under this scheme, being off balance right now is acceptable, provided there is a plan that recovers within the horizon. That is what permits running, jumping and stumbling over uneven ground.
What made it practical
Three things arrived together: enough onboard computation to solve an optimisation problem in a few milliseconds, force-controlled actuators that can be commanded to push with a given force rather than move to a given position, and sensing fast enough to correct the model when reality disagrees with it.
The hardware was necessary. The reframing of the problem was what mattered.