I just had an idea. Editions are not supposed to delete features, but they can change syntax; suppose we changed the syntax from
static mut FOO: String = String::new();
to
#[legacy_mutable_static]
static FOO: String = String::new();
Then, when someone tries writing static mut, they can justifiably get not just a deprecation warning but an explanatory syntax error, like
error: static items may not be mutable
help: use a container type with interior mutability, such as `std::sync::Mutex<String>`
and info on using the legacy attribute can be buried inside the error documentation page. This way, when newcomers try to follow the Rust principles they've already learned ("to make something mutable, add mut") they are guided to appropriate alternatives (whereas “deprecated” sounds both insufficiently scary and too temporary) and existing code continues to be upgradable to new editions.
(Of course, we could also decide that the deprecation is a special deny-by-default lint with the above text. But framing it as a syntactic difference and not just "the combination of static and mut is deprecated" seems potentially cleaner.)