Q:

REGEX para prefijos y sufijos cuando \b no reconoce caracteres españoles (Javascript)

Aclarar que estoy trabajando con las limitaciones que tiene en cuanto a regex el lenguaje Javascript. 
Necesito realizar una búsqueda regex de una palabra que puede contener (o no) prefijos (mega,super) y sufijos (ita,aza).  La palabra será una variable que, si por ejemplo valiera cas, la búsqueda quedaría así:
(mega|super)?cas(ita|aza)?[a-u]? 

En la práctica no habrá dos prefijos y dos sufijos, serán unos treinta antes y treinta después pero, para el ejemplo, he elegidos dos y dos.  De forma que si encontrase el siguiente texto, debería devolver tres resultados:
"Yo tenía una supercasita que se transformó en casa y acabó siendo una megacasaza." 

Match 1  supercasita
Match 2  casa
Match 3  megacasaza
Pero si el texto fuese el siguiente, no debería hallar coindencia alguna:
"Yo tenía unasupercasita que se transformó en casay acabó siendo una megacasaza." 

Ni tampoco debería encontrar nada en este caso:
"Yo tenía usupercasitana que se transcasaformó en y acabó siendo umegacasazana." 

Sin embargo, sí debería encontrar las palabras en este otro texto:
"Yo tenía una (supercasita) que se transformó en:casa y acabó siendo una...megacasaza." 

Sé que esto se solucionaría añadiendo al principio y al final de la regex lo siguiente:
\b(mega|super)?cas(ita|aza)?[a-u]?\b

Pero no puedo usar \b porque ciertas letras de nuestro alfabeto no las considera palabras, por ejemplo, si en base a la regex inmediatamente anterior tengo esto:
"Yo comprésupercasita que se transformócasa y acabómegacasaza." 

Y seleccionaría esto:
Match 1 supercasita
Match 2 casa
Match 3 megacasaza 
Cuando no debería seleccionar ninguna.   
Una vez expuesto el problema, estas son mis cuestiones:

Si tengo 30 prefijos y sufijos, ¿Cómo hago para no tener que utilizar ?:  en cada opción y por lo tanto evitar su captura, ya que solamente me interesa la captura global? 
Y la pregunta más difícil e importante, ¿Cómo simulo el comportamiento de \b para los casos de caracteres no contemplados como àäéëíïóöúüñç y más caracteres que existen en otros idiomas y seguramente no contempla \b

A:

Excelente pregunta.  No tiene una respuesta que sea "absolutamente" igual que \b, pero se aproxima bastante. 
Límites de palabra aproximados para español. 
Para el límite previo a la palabra, como no estás utilizando el caracter previo a la palabra, podemos buscar que coincida con ese caracter, comprobando que sea el inicio del texto (^) o un [^a-záéíóúüñ]. 
Para el límite posterior a la palabra, podemos verificar que no esté seguido por un caracter de palabra.  Es decir (?![ a-záéíóúüñ]). 
Entonces, una palabra completa coincide sii:
/(?:^|[^a-záéíóúüñ])(palabra)(?![a-záéíóúüñ])/iu

y si coincide, el resultado será capturado por el grupo 1 (así limpiamos el primer caracter que no nos interesa). 
esta es la única diferencia que tiene, que consume al caracter previo.  Pero si no importa (como en este caso), va a coincidir como corresponde con todos los límites buscados. 

No incluí dígitos ni guión bajo, que quizás no te interesen en este caso, pero se pueden cambiar los [a-záéíóúüñ] por [\d_a-záéíóúüñ] si se quiere igualar el comportamiento de \b. 

Llevado a tu ejemplo:
/(?:^|[^a-záéíóúüñ])((?:mega|super|ultra)?cas(?:ita|aza|ona|[aeiou])?(?![a-záéíóúüñ]))/igu

Demo:

const ejemplos = [
        "Tres coincidencias: Yo tenía una supercasita que se transformó en casa y acabó siendo una megacasaza.", 
        //La siguiente la modifiqué porque creo que estaba mal el ejemplo
        "Ninguna: Yo tenía unasupercasita que se transformó en casay acabó siendo una megacasazaa.", 
        "Sí en: Yo tenía una (supercasita) que se transformó en:casa y acabó siendo una...megacasaza." 
      ],
      regex = /(?:^|[^a-záéíóúüñ])((?:mega|super|ultra)?cas(?:ita|aza|ona|[aeiou])?(?![a-záéíóúüñ]))/igu;
      
var match, palabra;

for (let ej of ejemplos) {
    console.log('FRASE:', ej);
    while (match = regex.exec(ej)) {

        // Acá obtenemos el texto capturado por el primer grupo
        palabra = match[1];

        console.log('Palabra:', palabra);
    }
}

Para replace().  Hay algunos casos donde sí importa cómo tratamos al caracter previo.  Por ejemplo, si queremos poner en negritas a las palabras, tenemos que capturar al caracter previo ($1 será el caracter previo y $2 la palabra). 
regex = /(^|[^a-záéíóúüñ])((?:mega|super|ultra)?cas(?:ita|aza|ona|[aeiou])?(?![a-záéíóúüñ]))/igu;
//       ^^^^^^^^^^^^^^^^^
//   grupo con captura en vez de (?:   )

enNegritas = texto.replace( regex, '$1<b>$2</b>');

Y para otros casos, serán opciones similares, adaptando este tipo de lógica. 

Alternativas

Podrías utilizar la librería XRegExp (de Steven Levithan), que tiene un excelente soporte de inspecciones hacia atrás (lookbehinds) y de Unicode, permitiendo usar \pL (categoría Letra de Unicode).  Se integra muy bien con los métodos que utilizamos habitalmente. 

const re = XRegExp('(?<!\\pL)(?:mega|super|ultra)?cas(?:ita|aza|ona|[aeiou])?(?!\\pL)','igu'),
      texto = 'ácasa casañ megacasaza megasupercasona (casita)';
console.log(texto);
      
var match;

while (match = re.exec(texto)) {
    console.log(match[0]);
}
<script src="https://unpkg.com/xregexp/xregexp-all.js"></script>

Chrome 62+ y Opera 49+ soportan inspecciones hacia atrás.  Todavía es muy temprano para esperar que funcione en la mayoría de los navegadores, pero "funciona en mi PC" :-)

var regex;
try {
    regex = new RegExp('(?<![a-záéíóúüñ])(?:mega|super|ultra)?cas(?:ita|aza|ona|[aeiou])?(?![a-záéíóúüñ])', 'igu');
} catch (e) {
    throw new Error('Sólo funciona en Chrome 62+ y Opera 49+');
}

const texto = 'ácasa casañ megacasaza megasupercasona (casita)';
console.log(texto);

var match;

while (match = regex.exec(texto)) {
    console.log(match[0]);
}

