1つのコマンドしか書けないところに、複数のコマンドを;や|等でつないで書くとか、その他シェルの機能を使いたい場合。
例:xargsで複数コマンドを実行したい。
(リストアップしたファイルに対して、sedでバックアップ取りつつ書き換えて、バックアップを移動)
sh
1find ~~~~ | xargs -I@ bash -c "sed -i.bak 's/xx/yy/' @ && mv @.bak BKUP/"
あと、プログラムからプログラムを起動する場合。例えばC等で使うsystem()や、Pythonでいうとsubprocessパッケージでshell=Trueでコマンドを起動した場合は、内部的に-cが使われています。
このように、「コマンドラインで実行する時と同じように書いておくと、期待通り実行してくれる」という機能は内部的に-cを使っています。このとき使うシェルは/bin/sh決め打ちだったり、環境変数SHELLを見たり等いろいろでしょう。
シェルを使わないでも、プログラムから外部プログラムを起動することはできますが、空白で引数を分割するとか、;で複数コマンド実行とか、>でリダイレクトとか、$で環境変数展開とかは、シェルの機能なので、シェルを使わないで外部プログラムを起動する場合は使えないです。Pythonのsubprocessでshell=Falseの場合などですね。