信岡です。

> 私がわからないのはケース.3なのですが
> Rubyは最後に評価された値を返すはずですから
> 10を期待していましたが
> 結果はsplitされた文字の配列でした。
> また、ケース.2ではresult = 0が評価されていると言う結果なのに
> ケース.3ではその行すらも評価されないというのが2重にわかりませんでした。

文面から察するに、ケース 3 の calc メソッドの中で最後に評価される式が
splitprm.each メソッドに渡されたブロックの中の
     result += c.to_i
であると思っているのではないかと思いますが、それは正しくありません。
calc メソッドの中で最後に評価される式は
     splitprm.each do |c|
       result += c.to_i
     end
です。 すなわち splitprm.each というメソッド呼び出しの返り値がそのまま
calc メソッドの返り値になります。
(そして Array#each メソッドは self を返すので、calc メソッドの返り値は splitprm の
参照先と同一です。)

以下のように書き換えるとわかりやすいのではないでしょうか。

ケース 3' (ケース 3 とほぼ等価)
 def calc( prm )
   splitprm = prm.split( // )
   result = 0
   b = Proc.new{ |c| result += c.to_i }
   splitprm.each( &b )
 end

> これはバグなのでしょうか?仕様なのでしょうか?

そんなわけなんでバグではないですね。

-- 
信岡 ゆう (NOBUOKA Yu)