Those sub frames you load with atlas... You load them as 'source' when applying the image. Source images in kivy will reload every time and this is what creates that 'thrashing' effect. Notice how an atlas address a path...that's a clue. When you're using a texture, there's is no physical path because the texture is stored in a cache (memory) and accessed from it. Textures do not have to reload by path (from drive) when needed because they are already, ready to go in memory.
I have tested this effect over and over on an android device. Animations using textures stored in memory makes way for a much higher frame rate...versus pulling images from path/drive every time they're needed. I've worked with 2D game engines of the past that gave more control over what's loaded into memory and what's not, which makes me familiar with what's going on with kivy.
If I'm wrong, then something is terrible wrong under the kivy API hood because too much fps is still being lost if images from 'source' are indeed being kept in memory. I was going to build out kivy's 3D side myself, only if I got past the 2D side. So far, the 2D side is killing me.