That's not strictly the case. It has been shown to be possible to use fixed-function OpenGL for essentially general-purpose rendering.
What has been changing is the feasibility of certain algorithms. Before a feature is supported, the algorithm is just too slow to use in a game. Afterwards, it's usually fast enough.
This hasn't changed with PS 3.0. There are many algorithms that one can now accelerate on the GPU that just weren't feasible for a realtime situation before PS 3.0.
Examples:
With branching one can have a shader that changes based upon the output of the vertex shader, for instance. If the boundary between shaders on a model is too complex, it may not be feasible to render in realtime with using such an "ubershader."
With vertex textures, one can use output from the pixel program directly in the vertex program, allowing much better acceleration for some non-graphics work, such as water or cloth animation.