Simpler: make all the arrays global so you only have as many arrays as sprite sets. Less memory load that way too.
You can get funky fresh by organizing the arrays the same order with same indices as the master sprites (easy to do in Studio), use the ids of the master sprites for the left index in the 2d arrays, so the themes are the subindexes, then replace the draw events with draw_sprite_ext passing the array as the sprite index.
draw_sprite_part(global.spr_themes[sprite_index, global.theme], -1, x, y, image_xscale,image_yscale, 0, -1, 1)
Or if you want an option that pisses off some of the people around here, organize all of your Sprites in order with the themes in order. You can either have all of your master sprites together and then all of a particular theme together and then all of the next theme together; how are you can have each Master Sprite followed by each themed Sprite with the order of the themes the same for each as her Sprite. Then you would set the Sprite index to some modification of the Sprite that you actually assigned.
100 master sprites Grouped:
sprite_index = spr_wolf + 100*theme
4 Themes grouped:
sprite_index = spr_wolf + theme
As you can see, keeping the themes close to the master Sprite is easier. This is easy to pull off in studio, but requires a bit of craftiness and older versions of game maker.
If you wanted to noob it, you could always just use the asset_get_index() function...