“If they’re outside the screen, their data will still be send to the GPU, but they won’t be drawn anymore. So the overhead for bullets outside the screen is less, but still something to take into account depending on the number of bullets. When you’re experiencing performance issues try to set visible to NO when they’re outside the boundaries.”
In this one @riq recommends to set NO to the visible property of the layers/batches and @araker (again!) explains why:
The batchNode calls -updateTransform of each child in its -visit (= where the magic happens). If the sprite is not visible it replaces its quad in the textureAtlas of the batchNode with a empty quad (line 487 in CCSprite). This empty quad still occupies the same amount of data, but will be discarded faster than a normal quad by the GPU.