Para poder volver al procedimiento x se necesita salir de todos los niveles de recursividad a los que se haya entrado.
Cuando llamas a exit el flujo de la aplicación salta sólo al procedimiento más inmediato que haya llamado, que
normalmente no será x, sino el mismo brute dentro del ciclo for y por tanto continúa a la siguiente iteración (en el nivel recursivo anterior) así que tendrías que volver a examinar el valor de final luego de la llamada a brute en el ciclo;
Código Delphi
[-]
for ord := 65 to 90 do
begin
brute(n-1, str+chr(ord));
if final then exit;
end;
Esto no hace que llegues directamente al procedimiento x sino que genera una llamada a exit "en cascada" que se va transmitiendo hacia arriba en cada nivel de recursividad.
Haz un trazado del código paso a paso y te quedará más claro lo que está sucediendo.
// Saludos