Q:

Realizar una condición con ciertas reglas en el archivo .htaccess para páginas no encontradas

Necesito crear algunas reglas en al archivo .htaccess para que se den ciertas condiciones. Por ejemplo, quiero mostrar el archivo 404.shtml (ErrorDocument 404 /404.shtml) sólo en el caso en donde la URL generada tenga la extensión .html o .php (cuando este mal escrita claro o no la encuentre en mi sitio), en los otros casos no (que es cuando la página se comporta como SPA).
Al ser SPA (single-page application), trabaja siempre sobre la misma página y aquí no necesito que se vea el archivo 404.shtml. Entonces tengo lo siguiente y que ya está funcionando:    
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
Rewritecond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [NC,L]

Ahora quiero el caso contrario cuando no está en la página de tipo SPA. Necesitaría alguna regla para que se vea la página 404.shtml, cuando ya son las otras páginas internas y que siempre llevan la extensión .html o .php. y no están en el sitio (página no encontrada).
Sólo a modo de ejemplo, sería algo así:   
IF (la pagina es SPA){
    RewriteCond %{REQUEST_FILENAME} !-s
    RewriteCond %{REQUEST_FILENAME} !-l
    Rewritecond %{REQUEST_FILENAME} !-d
    RewriteRule ^.*$ index.php [NC,L]
} else {
    ErrorDocument 404 /404.shtml
}

En este momento lo tengo así en el archivo .htaccess:
...
...
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
Rewritecond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ index.php [NC,L]

ErrorDocument 404 /404.shtml

... pero el 404.shtml nunca se genera cuando la página no existe.
En definitiva, necesito que, si la URL está dentro de las manejadas por el SPA, se redirija a la SPA y en otro caso se redirija a una página 404.shtml 
¿Se puede hacer algo parecido a esto desde el archivo .htaccess?

A:

Solución propuesta
Para solucionar tu problema basta con excluir de la regla los directorios reales que tengas:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-s
RewriteCond %{REQUEST_FILENAME} !-l
Rewritecond %{REQUEST_FILENAME} !-d
# Excluimos (!) todo lo que empiece por las rutas deseadas
RewriteCond %{REQUEST_URI} !^/biografía/
RewriteCond %{REQUEST_URI} !^/historias/
# Excluimos (!) todo lo que termine en .html o .php
RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_URI} !\.html$
# Si todas las condiciones se cumplen, apoyamos el SPA
RewriteRule ^.*$ index.php [NC,L]

También se puede hacer con una única condición por cada comprobación:
RewriteCond %{REQUEST_URI} !^/(biografía|historias)/
RewriteCond %{REQUEST_URI} !\.(php|html)$

Documentación
El funcionamiento de RewriteCond/REQUEST_URI:

REQUEST_URI
The path component of the requested URI, such as /index.html. This notably excludes the query string which is available as its own variable named QUERY_STRING.

En castellano:

REQUEST_URI
La componente de la ruta de la URI solicitada, como /index.html. Esto excluye deliveradamente la cadena de consulta que está disponible como variable independiente llamada QUERY_STRING.

Pruebas
Creamos los siguientes archivos:
.htaccess
historias/otra.html
biografía/pruebas.html
pruebas/primera.html
pruebas/segunda.php
pruebas/tercera.txt

http://url/.htaccess: generará un Forbidden por las reglas de seguridad por defecto del servidor Apache.
http://url/historias/otra.html: Cargará el archivo HTML (reglas de directorio).
http://url/biografía/pruebas.html: Cargará el archivo HTML (reglas de directorio).
http://url/pruebas/primera.html: Cargará el archivo HTML (reglas de extensión de archivo).
http://url/pruebas/segunda.php: Cargará y ejecutará el script PHP (reglas de extensión de archivo).
http://url/pruebas/tercera.txt: Pasará al SPA.
http://url/pruebas/cuarta.html: Generará un error 404 (las reglas de extensión de archivo impiden el SPA).

