En el nivel más básico, ya existe una asimetría entre las partes de búsqueda y reemplazo :substituteporque la primera es una expresión regular y la segunda es texto, con secuencias de escape adicionales específicas . Esto solo se destaca por la intuición que tienes sobre lo que \nsignifica.
Por ejemplo, considere que \nen la búsqueda no coincide con un literal \n. Se coincide con el final de la secuencia de bytes de línea (EOL), que puede ser \r, \r\n, o simplemente \nen función de la 'fileformat'de la memoria intermedia.
En cuanto a por qué \rse usa para significar "insertar una EOL", hay algo de historia detrás de eso. Vi no tenía forma de manejar un byte NUL en un archivo. Vim mejoró eso al reemplazar los bytes NUL con un byte NL internamente (ya que las cadenas C están delimitadas por NUL).
Este detalle de implementación se filtró en el comportamiento de :substituteya que \nen el reemplazo simplemente se inserta en la representación interna de esa línea, que se utiliza para indicar un byte NUL. \rinserta una EOL, rompiendo la línea interna en dos. Vim en realidad no almacena los bytes EOL en la memoria, sino que (los) serializa cuando lee / escribe el búfer.
No se puede cambiar ahora sin romper los muchos scripts y la memoria muscular de muchos usuarios. Afortunadamente, está documentado en :help sub-replace-special.
\res<CR>y\nes<LF>. No aborda la pregunta real de por qué\n\rcomportarse de manera diferente en diferentes contextos.