Потому что для Eval нужно возвращаемое значение. У меня вот такой пример работает нормально:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
sc: Variant;
S : OleVariant;
begin
//CoInitialize(nil);
sc:=CreateOLEObject('MSScriptControl.ScriptControl');
SC.Language:='VBScript';
SC.Timeout:=-1;
SC.AllowUI:=True;
S := SC.Eval('2+2');
ShowMessage(S);
end;