q "echo test" "log.txt" estaria alimentando dois parâmetros.
"echo test" seria por si só, e não é mais "Echo" seguido de "test" como um argumento para Echo, mas sim um único comando chamado "echo test", que é inválido.
Você precisa separar os argumentos dos comandos, e realmente o script em lote NÃO é a melhor maneira de fazer isso, especialmente se você quiser uma quantidade dinâmica de argumentos. Olhe para o uso do PowerShell.
Dito isto, se você quer algo simples, não tão flexível, e ainda é um arquivo de lote, então tente o seguinte no seu arquivo de lote:
%2 %3 > %1 .
Em seguida, basta especificar o arquivo de saída primeiro, seguido pelo comando, seguido pelo argumento que você deseja usar com esse comando.
I.E .: q log.txt echo Test ou q log.txt echo "string with spaces to echo" .
Isso funciona para mim. :)