¿Por qué las aplicaciones de Android están escritas en Java pero el sistema operativo está escrito en C++?

Apartémonos de la primera idea errónea:
Puedes escribir tus aplicaciones en C++. Usted encontrará que la mayoría de los juegos de alto rendimiento están escritos en C++.
Ahora para responder realmente a la pregunta: ¿Por qué las aplicaciones de Android están escritas en Java?
La misma razón por la que usamos el marco de trabajo .Net o Java en Windows, por ejemplo.

Escribir una vez, ejecutar en todas partes es la teoría.
Lo bueno de usar un marco de trabajo como Java es que tu aplicación se ejecuta en la máquina virtual de Java.
Cuando construyes una aplicación usando Java no se compila a un código nativo que se ejecuta directamente en el procesador, sino que se compila a una forma binaria intermedia llamada código de bytes JVM que luego es compilado por la JVM en código nativo que se encarga de casi todo, como la gestión de la memoria, la recolección de basura, la IO de archivos, etc. etc.
Por lo que sé esto se llama código gestionado ya que todo se gestiona desde la JVM y como desarrollador sólo tienes que preocuparte de construir tu aplicación y no de todas las demás cosas aburridas para asegurarte de que no tienes ningún problema de seguridad, fugas de memoria o basura llenando tu memoria.

Como he dicho al principio puedes construir tu aplicación en C++, de hecho puedes crear un C++ en Android studio pero entonces tienes que encargarte literalmente de todo tú mismo lo cual es un poco molesto pero obtienes la potencia bruta de tu aplicación corriendo nativamente en el procesador.

El problema es que tendrás que recompilar tu aplicación para cada tipo de procesador mientras que con Java tu JVM se encarga de la compilación JIT en el código correcto para el procesador.

Así que por suerte para nosotros, tenemos marcos como Java o el marco .Net o de lo contrario habríamos tenido sólo unas pocas aplicaciones disponibles y de las cuales muchas tendrían algunos problemas serios.