Well, you avoid double evaluation. You do pay a price in time (tabled execution needs to maintain tables and is thus slower if you get no profit from its reusing its tables) and notably in memory. Finally, truth maintenance is harder: if bar/1 somehow depends on anything buts its arguments you must be sure its tables are properly invalidated and recomputed. So, in general I don’t think this is a wise replacement.
if_(bar(X), foo(X), mep(X)).
foo(1) :- writeln(foo).
mep(2) :- writeln(mep).
% Notice you provide the boolean output of the condition as the
% last output argument (this is called reifying the truth value)
Notice you have to reify the truth or falsity of the condition (bar/2). This means you make the truth value be an output argument of the predicate. The value is true if the condition is true, or false if it is false.