The body of a dynamic-wind isn't in tail position, because just after it determines a return value (or other exit), it runs some extra code (the after part).
The Racket documentation specifically says that the last expression in a 'parameterize form is in tail position, so they must use some magic or other. What I suspect is that for every stack frame, Racket keeps a table of the parameterizations made by that stack frame. Any given parameterize form doesn't need to introduce a new stack frame; it can just mutate the most recent stack frame's association data structure, overwriting any previous value it had been binding to that parameter. Technically it's storing something on the stack this way, but it's only storing a maximum of one thing per parameter per frame.
In fact, they vaguely spell this out if you look in the right place in the Racket docs (http://docs.racket-lang.org/reference/eval-model.html#(part....): "Each frame is conceptually annotated with a set of continuation marks . A mark consists of a key and its value[...] For example, marks can be used [...] to implement dynamic scope."