Hola.
Efectivamente, si el hilo de ejecución está en main con return saldrás de la función, y en este caso, del programa.
En cambio, si estás en alguna subfunción has de usar exit. Esta función realiza las misma acciones que un return en main: para la ejecución del programa y ejecuta las tareas de limpieza (se pueden registrar funciones para que se ejecuten al finalizar) y, a continuación, devuelve al sistema operativo el código de retorno.
Sin embargo, dependiendo de la gravedad de lo sucedido para tener que abortar la ejecución, podrías necesitar el uso de abort. Esta función cancela la ejecución sin realizar las tareas de limpieza y devuelve el control al SO inmediatamente.
En C++ la diferencia entre exit y abort es aún mayor. Con la primera los destructores de los objetos son llamados, mientras que con la segunda no.
Un saludo.
Ruben3d