Você pode usar o WinActive ou o WinExist para verificar o fechamento da janela. Você também pode usar uma instrução while para combinar as instruções de quebra condicional, em vez de precisar de um if / break separado. Eu também me certificaria e inicializaria a variável BreakLoop caso você execute o script várias vezes sem reiniciá-lo totalmente.
#NoEnv
^m::
setTitleMatchMode, 2 ; inexact title match
myID := WinExist(myWinTitle:="A") ; put WinSpy title details here
BreakLoop = 0
While !BreakLoop and WinActive("ahk_id" myID)
{
SEND, 3
SEND, {Enter}
SEND, {Enter}
SEND, {Enter}
SEND, {Enter}
sleep, 100
}
Esc::
BreakLoop = 1
return