I came to Rust before the 2018 edition and stuck with it after, and the thing nobody quite prepares you for is how much the edition changed the feel of the language without changing the language. None of it was revolutionary on paper. All of it added up.
The module system is the big one. The old extern crate declarations, the mod.rs files everywhere, the path rules that never quite matched my mental model: I spent more time than I would like fighting the compiler about where things lived rather than what they did. The 2018 path changes made use paths behave the way I had always assumed they should, and mod.rs became optional. Suddenly the structure of a crate was something I could reason about without a diagram.
Then there is non-lexical lifetimes, which is the change I would single out as making the borrow checker bearable. Before NLL, a borrow lived until the end of its scope whether you used it or not, so the checker rejected code that was plainly fine. You learned the workarounds, the extra blocks, the temporary bindings. With NLL the borrow ends when you stop using it, which is what every human already assumed. A whole category of "but that's obviously correct" arguments with the compiler simply evaporated.
The smaller touches mattered too: dyn Trait made trait objects readable, and ? on main removed a layer of ceremony from every example program. None of it was the kind of feature that makes a headline. Together they took a language I respected and made it one I actually enjoyed writing, which is a harder and rarer thing to pull off.