Após acrescentar um trecho para o código pausar por um tempo, a cada iteração, está saindo do laço, mas o comportamento ainda é muito estranho: ele retorna ao depurador numa janela que mostra as classes dos objetos e fica piscando, como se as teclas ainda estivem sendo enviadas. Segue novo código:
Private Sub cmdMascara_Click()
Dim ultlinha As Long
Dim i As Long
ultlinha = Worksheets("AUDIENCIAS").Cells.Find("*", , xlFormulas, xlPart, xlByRows, xlPrevious).Row
i = 2
While True
Range("A" & i).Select
SendKeys "{F2}", True
SendKeys "{ENTER}", True
H = Hour(Now())
M = Minute(Now())
S = Second(Now()) + 0.5
espera = TimeSerial(H, M, S)
Application.Wait espera
i = i + 1
If i >= ultlinha Then
Exit Sub
End If
Wend
End Sub