CALL
is very special in this case!
The batch parser has different phases, in the special character phase unquoted carets are used to escape the next character, the caret itself is removed.
In your case, the carets are quoted, so they will not be affected.
Then the carets can be affected again in the delayed expansion phase, but quotes havn't special meaning there, the carets are used only to escape exclamation marks.
Normally after the delayed phase all is done, BUT if you use CALL
all carets are doubled.
Normally this is invisible, as the CALL
also restarts the parser and carets are removed in the special character phase again.
But in your case they are quoted, therefore they stay doubled.
Try this
call call call call echo a^^ "b^"
Output
a^ "b^^^^^^^^^^^^^^^^"
The parser is explained at How does the Windows Command Interpreter (CMD.EXE) parse scripts?