Эта строка преобразует ${v1/txt/file}
в значение до выполнения команды:
$ ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo ${v1/txt/file}"
А это значит, что bash -c даже не видит ${v1/txt/file}
В этой строке одинарные кавычки запрещают подстановку переменных, поэтому echo processing {}; v1={} && echo ${v1/txt/file}
фактически передается bash -c в качестве параметра:
$ ls c*txt | xargs -i bash -c 'echo processing {}; v1={} && echo ${v1/txt/file}'
Вы можете сделать то же самое, избежав знака доллара:
$ ls c*txt | xargs -i bash -c "echo processing {}; v1={} && echo \${v1/txt/file}"