出力している、と考えた方がいいかもしれません。最後に、実際に実行してなぜエラーにならないか、ですが、s[-1]は、「メモリ上に配置されている"hello"の、hの一つ手前の番地(hの一つ前)」を参照しに行きます。そのメモリ上に格納されていた何かしらが、s[-1]の結果として取得され、printfで文字コードとして出力されます。結果には、「改行のみの印字」とありますが、端末で表示できない文字コードが出力されている可能性が高いです。lenは実行時にしか値は確定しませんので、コンパイラーがエラーもしくは警告できるとは限りません。read.とC6385警告が出力されることを確認しました。1を使用すると、実行時でなくコンパイル時に計算が行われるようになりますので、警告できるコンパイラーの種類は増えるはずです。