procedure Hoge(var obj : TObject);

とすると呼び出し側で TObject 継承クラスを渡せなくなる言語仕様は
とっても合理的だよ。なぜならば以下のようなケースを未然に防げるから。

procedure Hoge(var obj : TObject);
begin
 obj := TObject.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 Memo: TMemo;
begin
 Hoge(Memo);
 Caption := Memo.Text; // memo 変数に入っているのは実際は TObject なのでエラーになる
end;

近眼的な視点でどーたらどーたら言っても意味がない。