Isso não foi testado, mas acho que vai funcionar, e deve ser relativamente rápido. Com base no seu método atual, levando ~ 6 minutos por arquivo, prevejo que esse método leve menos de 10 minutos para ser concluído. Ele lê a hierarquia de pastas inteira apenas uma vez e, em seguida, verifica o resultado em todas as entradas do addr.txt em uma única passagem.
@echo off
pushd "c:\cleanup"
:: Prepare addr.txt to be used as /g option for FINDSTR
(for /f "usebackq delims=" %%F in ("addr.txt") do echo \%%~nxF) >addr.txt.mod
:: Get a list of full paths to all files in hierarchy
dir /b /a-d /s "z:\attachments\pdf\*" >files.txt
:: Match files in files.txt against files in addr.txt.mod
for /f "delims=" %%F in ('findstr /ileg:addr.txt.mod files.txt') do (
REM %%F contains the full path of a matching file
xcopy "%%F" "C:\cleanup\XMLFix%%~pF"
)
:: Delete temp files
del addr.txt.mod files.txt
popd