In SQL Server, you can do this with a side join. The correct syntax is:
select t.*, v.min_dte
from t cross apply
(select min(v.dte) as min_dte
from values ( (t.a), (t.b) ) v(dte)
) v;
This is very convenient as the number of values increases. However, performance is likely to be slightly worse (but not much worse) than a single expression.
As for one expression, I would go for:
case when b is null or a < b then a else b end as min_datetime
, . .