Because it's just one global instead of constant space added to all the closures/stacks. One map of symbols to values, not a whole world of them. If I had to guess.
i don't think dynamic scoping saves you space; with either dynamic scoping or lexical scoping, each call to a function that binds three variables must allocate space for three values. the only difference from that perspective is that, with dynamic scoping (and shallow binding!), the newly allocated space holds the old values of the variables, while with lexical scoping (or deep binding) it holds the new values
some implementations of dynamic scoping with shallow binding store each of the three values in a separate cons cell, doubling the space cost, but that's not essential to the dynamic/lexical distinction
You can get away with having a single global state variable so long as it's an association table and you keep track of what variables you've introduced. I believe that the reason why people thought it would be slow then was that no one had used a data structure that could store multiple results for the same value.