Si, come giustamente dici la parte minima in Assembly è riservata a quelle parti che non si può scrivere in C.
Considera che C è nato prima di C++, quindi a sviluppo iniziato ai tempi hanno proseguito sulla strada già intrapresa. Con il kernel Linux subentrano probabilmente anche questioni filosofiche, oltre che dovute strettamente ai due linguaggi. C++ ovviamente ha un overhead maggiore, e in quegli anni il linguaggio usato per lo sviluppo di kernel era C.
Questo è il pensiero di Torvalds, almeno in quel momento, su C++ (e non è cambiato):
https://harmful.cat-v.org/software/c++/linus
Sicuramente C è un linguaggio più semplice, si porta dietro sicuramente meno dipendenze, e il codice che produce è molto più semplice da leggere (parlo proprio a livello di assembly); quindi in caso di bug di qualche tipo, si faceva sicuramente meno fatica a capire il problema. Inoltre hai un controllo differente sulle allocazioni di memoria.
Se guardi
Linux su github, noterai che C++ non è presente (guarda a dx, c'è l'elenco dei linguaggi usati e le rispettive percentuali).
In merito a Microsoft è difficile dire esattamente la quantità di codice C rispetto a quella in C++ che utilizza, per il semplice fatto che è chiuso. Sicuramente qualcosa in Assembly c'è, e sicuramente l'API che espone (Windows API) è scritta in C. Presumo che il kernel non sia stato propriamente riscritto, ma anche qui, per un kernel forse ci sono meno ragioni per un passaggio a C++ rispetto al C.
Per la scrittura di driver, che sono poi una componente che gira in "kernel mode", Microsoft consiglia l'utilizzo di C++ e non di C. In effetti a quanto ho visto è anche piuttosto comodo, specie negli ultimi anni. Ma alla fine è un "C++ strutturato", più simile al C, che a un classico programma in C++ (niente classi e template, ad esempio).
Questo è dovuto a un motivo: nel kernel non è presente il runtime per C++, quindi tante sue funzionalità non le si può utilizzare: try/catch per gestire le eccezioni, la libreria standard di C++, e gli operatori new/delete, ad esempio.
Oggi come oggi poi ci sono altre scelte alternative, come Rust, a cui Linux ad esempio sta iniziando a guardare (ti eviti i problemi legati a C dovuti a bug che hanno a che fare con la gestione della memoria errata da parte del programmatore... e non solo).
Pare che anche nel kernel Linux qualche modulo venga/verrà scritto in Rust,
Rust in the Linux Kernel by 2023, Linus Torvalds Predicts.