Intentaré explicarlo de forma sencilla:
Una ROM se consideraría el sistema operativo completo (piensa en MS Windows, Mac OSX) – en este caso una versión del sistema operativo Android. Todos estos sistemas operativos tienen una sección de código, que se llama el kernel. El núcleo es responsable de numerosas cosas dentro del sistema operativo, sobre todo de distribuir las capacidades de procesamiento entre los programas (programación).
Cuando se habla de ROM o kernels «personalizados» dentro de la comunidad Android, la gente se refiere a paquetes de software completos (Cyanogenmod, ParanoidAndroid, etc.) o kernels que son software de posventa y no son enviados por el fabricante. Un kernel personalizado sería la sección del sistema operativo que se encarga de la programación, etc. Ambas cosas están en contraste con el «stock Android», que es lo que se envía en los respectivos dispositivos Android.
Se puede flashear (instalar) un kernel personalizado en una ROM de serie para mejorar potencialmente el rendimiento/la duración de la batería, etc., dependiendo de lo que la persona que desarrolló dichos kernels intente conseguir con ellos (es decir, una programación más agresiva, overclocking, undervolting, etc.)
Espero que esto le aclare las cosas.