The top-level environment isn't an exception to lexical scoping. It's
just the only "region" (in R4RS terminology) that's mutable in most
Scheme implementations. The reason we think of it as an exception is
that we're used to typing at read-eval-print loops that allow us to
add new code to it interactively, making it a pain for the compiler to
keep track of.
I can imagine a groovy development environment whose UI allowed you to
hit a breakpoint in a function, add new local definitions to the code,
and continue. The fact that a particular row of the environment is
mutable doesn't mean it's somehow not lexically scoped.
(This actually isn't a theoretical example. Tim Teitelbaum's Program
Synthesizer did this with Pascal programs; you could even hit a
breakpoint, cut and paste code that contained that breakpoint, and
then continue. It would flag any statically detectable errors as soon
as you pasted the code, but you could continue to run until you hit
something erroneous. I'm not sure it was useful, but it sure was
cool.)
(This is so off-topic.)