Many of us were doing systems programming with other languages before C went mainstream.
What you need to learn is computer architecture.
Getting back to JVM or .NET, you can get hold of JIT Watch, VS debug mode or play online in SharpLab.
Get to understand how some code gets translated into MSIL/JVM, and how those bytecodes end up being converted into machine code.
https://github.com/AdoptOpenJDK/jitwatch/wiki/Screenshots
Languages like F# and C# allow you to leave the high level comfort and also do most of the stuff you would be doing in C.
Or just pick D, which provides the same comfort and goes even further in low level capabilities.
Use them to write a toy compiler, userspace driver, talking to GPIO pins in a PI, manipulating B-Tree data stuctures directly from inodes, a TCP/IP userspace driver.
Not advocating not to learn Zig, do it still, the more languages one learns the better.
Only advocating what might be an easier transition path into learning about systems programming concepts.
With Python, Perl,R, Bash... whatever, I never had to know any C to be very productive.
With F#, good luck not knowing C#. With Clojure, not knowing Java is a pain. I've tried both several times and was frustrated by constantly being referred to something Java related that I didn't understand. Because of that, I feel like those languages will never pick up anyone outside of regular users of C# or Java that want to try something different. Of course there are exceptions, but they're just that.
I agree with you that perhaps one should go through all of what you're referring to Ex: learn assembly, write a Forth...etc.
I'm just saying a lot of these supposedly amazing languages stagnant with regards to their userbase for a reason. APL uses an entirely different way of doing things than Clojure, but I'd bet I could get up to speed a lot faster with APL than Clojure where I constantly have to fight with learning the daunting ecosystem.
That said, you can get quite far without needing to understand pointers or memory management in any of the example languages you mentioned - "Clojure, Scala, F#, Rust". In the first 3, the garbage collector still does most of the work. In the last, there is are no calls to malloc() or free(). Rust's compile-time lifetime concept allows to compiler to do the work for you.