./script.sh está executando um script da mesma forma que executamos um arquivo binário. O interpretador é escolhido de #! no caso de ser um script e não um binário.
bash script.sh invoca bash como intérprete para executar o script.
Ambos parecem quase iguais, mas existem diferenças.
Uma grande diferença é que script.sh deve ser executável para que ./script.sh funcione. Esse é um arquivo com 644 , a permissão não pode ser executada dessa maneira. Por outro lado, para bash script.sh , o interpretador pré-definido /bin/bash já é executável. Portanto, um arquivo com 644 permission funciona com esse método.