[ … ] is equal to
test …, so
! [ … ] is equal to
! test …. That means, you negate the result of the command
test. In this case,
! is a shell command.
info bash, e.g. in section «pipelines»:
If the reserved word `!' precedes the pipeline, the exit status is the logical negation of the exit status as described above.
On the other side,
[ ! … ] means
test ! …. That means, you negate an expression within test. See
EXPRESSION is false
So it can have a different meaning. If you have complex expressions, the negation may only apply to a part.
It is up to you, what you prefere.