Like I said, the important thing is the average size of these animations. I'm working on a low-resolution pixel art game where images are small (50x50 px or less), so I have sprites with hundreds of animations. Storing multiple animations in one sprite helps to better organize the project and the code.
I can load the entire sprite because it doesn't use much memory. But in your case you might need to put all these abilities into separate sprites and combine them into a family. Then only spawn the abilities which are required on the current level to save memory.
Regarding the object EnemyAbility, I'm quite confused about making a copy of the same object. Does it mean that they will be distinguished from one another using a variable like "EnemyID"
Yes, correct, use instance variables.
I currently have Player1, Player2, Player3 etc objects all nested into a family with family instance variables. Should I be tweaking my approach to using clones of a single object instead?
Probably not, if each player sprite has a unique set of heavy animations, and you don't need all these players on the layout at the same time, then it's better to keep them as separate objects.
Every game is different and there is no universal advice. It's normal to re-think the way you organize your objects once you start developing the game, I do this all the time - combining/splitting sprites etc. It's good that you are using families and instance variables already, you are on the right path.