Funnily enough it's not the limit placeholder that seems to be the primary issue. For the most part, the generic stuff just works for that. It's the "plus" or "minus" keyword that confuses things.
sage: L=I.operands()[0].operands()[0]
limit(1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*a + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*a*k) + 1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*b + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*b*k), t, -Infinity, plus)
sage: Ls=L.operator()(*L.operands()[:-1]); Ls
limit(1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*a + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*a*k) + 1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*b + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*b*k), t, -Infinity)
sage: Ls.simplify_full()
1/2*sqrt(pi)*e^(-1/2*k^2*s^2 - I*a*k - I*b*k)*limit(sqrt(2)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*b + sqrt(2)*t)/s)*e^(I*a*k) + sqrt(2)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*a + sqrt(2)*t)/s)*e^(I*b*k), t, -Infinity)
i.e., the direct problem is that the keyword "plus" does not get translated appropriately. In fact:
sage: L.operands()[-1].is_symbol()
True
sage: L.operands()[-1]._maxima_()
_SAGE_VAR_plus
as you can see, the maxima symbol "plus" got translated to a symbolic variable, which doesn't round-trip properly. It would have been nice to recognize "plus" on the maxima side not into a variable.
For the rest:
sage: limit(L.operands()[0],t=-oo,dir='+')
limit(1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*a + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*a*k) + 1/2*sqrt(2)*sqrt(pi)*s*erf(1/2*(I*sqrt(2)*k*s^2 - sqrt(2)*b + sqrt(2)*t)/s)*e^(-1/2*k^2*s^2 - I*b*k), t, -Infinity, plus)
which gives a bit of a pointer to the sage user interface (we shouldn't use that as "placeholder", though: it punts to maxima by default, so it shouldn't be called for interpreting the result that comes back).