1. The first solution that you're suggesting SKSpriteNode with animation and texture" require the computer to load the texture to the view. If you have multiple .png files, this would mean that the computer would need to load all of these files. But if you were to use SKShapeNode, you would avoid having to do this and you would cheaply create the same looks as the SKShapeNode is not based on an image.
2. Solution 2 is the most costly to your CPU because running a video. This takes a lot of space in your memory which might even create lags if you run it on your phone.
Also, just another thing to note: If you were to extensively use Solution 1 and 2, you would end up using so much memory. But if you use the Solution 3, you will not deal with this.
Actually, SKShapeNode is the worst solution here no matter what. It requires one draw call per node and will degrade performance greatly if not used sparingly... By the way, why would you ever use SKShapeNode for this particular case, instead of a colored SKSpriteNode which, unlike SKShapeNode can be rendered in batches ? IMO, SKShapeNode is not even worth of mentioning for the current problem.