De toute façon, à chaque repaint(), il faudra bien repeindre toute la zone à repeindre. Si pour cela, il faut redessiner 10 fois l'image, il faudra bien le faire. Mais ne te fais pas trop de souci côté performances. Une fois l'image chargée en mémoire dans un objet de type java.awt.Image, la repeindre dans un panneau est très efficace. C'est d'ailleurs par ce mécanisme que l'on gère un panneau avec double bufferisation pour éviter le clignotement, lorsqu'on redessine très fréquemment un panneau graphique.
Ceci dit, ce que tu peux faire, pour une meilleure efficacité, c'est peindre l'image en utilisant le mécanisme de clipping. Ainsi, à chaque fois que tu dois redessiner, tu définiras la zone dite de "clipping" qui seule doit être repeinte, et tout redessin en dehors de cette dessin sera sans effet et ne coûtera quasiment rien côté temps d'exécution.