Hola,
No entendimos dónde se aplica lo que escribiste sobre que 5/4<10.
El caso con i=5 y j=5 es incorrecto. Esto debido a que (i*j+i < j*j+4) se corresponde con (30<29) y por tanto da falso.
Al ser falso y haber un || (doble or), tiene que hacerse la evaluación de la segunda expresión (j/(j-i) < 10) que es equivalente a (5/0 < 10), pero al hacer 5/0 el resultado es Inf (infinito) e Inf<10 da falso. O sea que no entra al if y no va a ejecutar ningún disp(...) del código.
El caso con i=2 y j=2 es correcto. Esto debido a que (i*j+i < j*j+4) se corresponde con (6<8) y por tanto da verdadero. Al ser verdadero y haber un || (doble or) ya sabemos que el resultado será verdadero. O sea que sí entra al primer if. Luego en el segundo if la condición es i==j, que en este caso es (2==2, verdadero) y por tanto también entra a ese if y ejecuta disp('SI'), por lo que escribe el texto 'SI' en pantalla.
Por último, aclaro que en las versiones de Octave que manejamos, en los if y while siempre se ejecutan los operadores & y | como si fuesen && y ||. Siempre la ejecución es perezosa o lazy aunque usemos & y | .
Espero haber aclarado las dudas de esta pregunta,
Eduardo