Ok. I found the answer in the source code for Irlan Robson's Bounce Physics engine.
https://github.com/irlanrobson/bounce/blob/master/src/bounce/dynamics/contacts/contact_solver.cpp
The key is to store the restitution velocity bias before the solver starts (for example in the contacts setup method for the solver).
if (relativeNormalVelocity < -THRESHOLD) {
contact.velocityBias = -relativeNormalVelocity * restitutionCoefficient;
} else {
contact.velocityBias = 0;
}
Then in each step of the solver when you calculate the accumulated impulse you add in the velocity bias:
float oldImpulse = contact.impulse;
float impulse = (-relativeNormalVelocity + contact.velocityBias) * contact.mass;
contact.impulse = max(contact.impulse + impulse, 0.0f);
impulse = contact.impulse - oldImpulse;
That way the relative velocity for the restitution is preserved throughout the iterations.
Thank you @Irlan Robson