Ok, we simplify.
You have double buffer
double buffer good.
blitting all of buffer every frame not good
blitting only needed part of buffer good
keeping list of changed regions helps
blitting only changed regions will make game fast
Nah, but seriously: All you do is instead of blitting the complete buffer, you only blit changed parts of the buffer. Since this will be even faster than blitting the complete buffer, you get all benefits without drawbacks.
If you don't want to keep a list, try this (it's not quite as good, but should be easy to implement):
Your screen is 1024x768
Divide that into quads of 128x128
Whenever you draw something mark the quad you're drawing in as "dirty".
When you blit the buffer, only blit the "dirty" quads.
If more than "n" quads are dirty, blit the whole screen.
This way you can keep a simple array to keep track of the dirty parts.
If the only things moving are:
The paddles, the ball and the shots, you can blit the paddle columns, the area surrounding the ball and parts of the line of each shot.
The area you need to blit can be easily found by the speed of the shot / ball and it's current position.
Then you don't even need to mark the area as dirty, you can simply calculate what#s dirty.