Você precisa usar { list;} em vez de (list) :
if ! { [ -f file1 ] && [ -f file2 ] && [ -f file3 ]; }; then
: do something
fi
Ambos são Comandos de agrupamento , mas { list;} executa comandos no momento ambiente de shell.
Observe que o ; em { list;} é necessário para delimitar a lista de } palavra reversa, você também pode usar outro delimitador. O espaço (ou outro delimitador) após { também é necessário.