Não tenho ideia sobre suas perguntas diretas. Mas o seu arquivo de lote não pode funcionar como está escrito.
Você não pode usar %setup% no mesmo bloco de código (loop FOR) que define o valor porque o bloco inteiro é analisado em uma passagem e o valor é expandido antes que a análise ocorra. O valor é definido corretamente, mas o valor expandido será o valor que existia antes de você entrar no loop.
Na primeira vez que você executa o script em lote, a variável setup ainda não está definida, por isso, ela falha completamente. O valor é definido, mas seu loop não pode vê-lo. Seu script não tem setlocal , portanto, o último valor que foi definido é preservado quando o script é encerrado. Na próxima vez que você executar seu script, ele usará o valor preservado da última execução em cada linha do arquivo XML.
Acredito que você consiga corrigir esse problema específico substituindo call %%setup%% por %setup% .
EDITAR
Ou melhor ainda, simplesmente elimine totalmente a variável setup e use %%i diretamente:
for /F "tokens=2 delims=<>" %%i in ('type test.xml ^|find "<install>"') do (
echo installing %installer% >>log.txt
%%i
)
Observação - não entendo de onde o valor installer está vindo. Estou assumindo que você sabe o que está fazendo, mas parece estranho para mim.