Use a expansão atrasada, por exemplo, coloque
setlocal enabledelayedexpansion
no início do seu lote e, em seguida, use
FOR %%U IN (%globalvar%) DO (
call :SUBROUTINE %%U
echo Variable DYNAMIC after Subroutine: !dynamic!
)
%dynamic%
é expandido o instante cmd
analisa o ciclo for
completo; portanto, ele não pode pegar um valor que você definiu na sub-rotina (o que obviamente acontece dentro do loop).