The things I've found are productivity and reliability multipliers are:
Unit testing - and the modularisation that it forces you to do. It's great to unit test C not just because it tests your code well before it runs on hardware, but also because it's basically impossible without embracing dependency injection and modular "object oriented" C. Personally, working with a bunch of higher level languages - Rust, C#, Scala, Python - and the tooling that they have gave me a much better understanding of how things can be done. I'm a big fan of Ceedling - http://www.throwtheswitch.org/#download-section
Writing firmware which can target a desktop environment. The hardware dependencies should be a small part of the project, and easily replaced with fakes or simulators.
Having a CI pipeline which runs tests/linters/builds for you.
Those aren't necessarily easy to insert into an existing project though. Honestly I think the most useful thing is just building projects using other languages, and taking the best parts back into the low level code. It depends a bit what kind of projects you're working on - if it's mostly just glue between peripherals then these approaches are a lot less useful than if you're doing complicated maths or json parsing or higher level stuff.