Citando o manual do bash :
History expansion is performed immediately after a complete line is read, before the shell breaks it into words.
A expansão do histórico é o primeiro estágio do processamento, mesmo antes da análise do shell, e é por isso que as aspas duplas não protegem !
: o segundo é processado antes das aspas duplas. Ele é manipulado pela biblioteca de históricos, que implementa sua própria análise, com algumas maneiras de proteger o operador de histórico:
Only ‘
\
’ and ‘'
’ may be used to escape the history expansion character, but the history expansion character is also treated as quoted if it immediately precedes the closing double quote in a double-quoted string.
No momento em que o analisador do shell começa a manipular uma string, ele já foi analisado pela biblioteca de históricos e a expansão do histórico já ocorreu.