Dynamic environment and dynamic extent are not the same thing.
The latter refers to the before and after thunks of dynamic-wind,
while the former refers only to parameter bindings.  I believe you
intend for promises to be run in the dynamic extent of the time
that they were created, not the environment.

Have you run any benchmarks for this?  It seems an extremely
heavyweight operation for something which should be very
lightweight.  The dependence on dynamic-wind also means
performance will be highly variable per implementation.

Note I think delay-force/lazy were a mistake.  Their semantics
are of course desired, but I think in retrospect it's sufficient to
require (delay (force x)) be statically detected and the same
guarantees made - this can be done portably.