Long answer...
If you were to print out *each* of the red values after each frame what you'd find is a non-linear rate of change.
In other words, on the first frame, red will jump from 0 to 40, thus delta red (dr) = 40.
On the second frame, red will jump from 40 to 74, dr = 34. If at this point you wonder why it's 74 and not 80, and if so, then you may misunderstand how alpha works.
But let's keep going a few more frames...
On the third frame, red will jump from 74 to 102, dr = 28.
On the 1000th frame, you'll probably notice it "stuck" at 252 (or 251 or 253, whatever the exact value was, at any rate short of 255).
Why?
Let's look at some math. First, you've asked for an alpha of 40, and what does that mean? It's really a fraction: 40/255ths. That's how much of the "new" color you want blended into the "old" color.
How much of the old color remains? The inverse of your alpha, (255-40)/255 or 215/255ths. So that your alpha, plus the inverse, equals exactly 255/255 or 1.0 - that's important.
So, on the first frame: 0 (existing red) * 215/255 (inverse alpha) + 255 (requested red) * 40/255 (alpha) = 40.
On the second frame: 40 (existing red) * 215/255 (inverse alpha) + 255 (requested red) * 40/255 = 73.7
Et cetera. In short, at each frame you'll effectively get a "fraction of the fraction" - you are definately NOT simply adding 40 to red each frame. (which is called additive blending, not alpha blending)
Eventually you'll reach a point where the difference in the calculation is < 1 (integer) - at which point you can add that number forever and the integer rgb values will never increment - in other words it gets "stuck".
So, yes, *in theory* infinitely stacking those alpha reds would give you 255, but *in practice* it won't. You end up with hundreds of accumulated frames of integer rounding error by the time you get close enough to get stuck.
This is compounded, though only slightly, by the common practice amongst programmers to use /256 (which can be optimized with shift operations) instead of /255 in things like alpha calculations. The difference there though is slight and would probably only change whether it gets stuck at 251 or 252. (for example)
There are workarounds, but they can be complicated and/or performance drags. Like building your own intermediate floating or fixed point buffers to handle fractional rgb values and then converting down to integers only when needed for display. But that's a huge long topic in itself, and I've rambled long enough.
Hope that helps,