As chaves são usadas para expansão de parâmetro ( ${foo%123} ), expansão de contraventamento em formas alternativas ( {foo,bar} ) ou de sequência ( {1..25} ) ou em blocos de código ( { foo ; bar ; } ).
Os colchetes são usados como comparação de comandos ( [ "$foo" -lt 3 ] , [[ $bar =~ ^123 ]] ), como uma classe de intervalo ou caractere em uma glob ( ba[rz] , foo[[:alnum:]] , qu[[=u=]]x ), como parte de uma atribuição de matriz ( foo=([2]=3 4 5) , foo[42]=bar ) ou na expansão de parâmetro ao lidar com uma matriz ( ${foo[@]} ).
Em outras palavras, elas são completamente diferentes.