Is this Russian roulette code correct?
I think you're right and the subtraction is a mistake. The code should rather be multiplying the fraction of photons not absorbed into the weight. Something like:

float fraction_absorbed = sigma_a / sigma_t;
absorption += w * fraction_absorbed;
w *= (1.0f - fraction_absorbed);


This makes absorption the total fraction of photons absorbed so far, and w the fraction of photons remaining.