Heya,
If you want to keep your C++ cleaner, why don't you let Squirrel delegate the callbacks? ... In other words, have your C++ call a delegation squirrel function, passing a bunch of generic info. Then the delegation function in squirrel can call the appropriate spell function...
function fireball(player,...) {...}
spellTable["fireball"] <- fireball;
function doSpell(spellName, player,...) {
spellTable[spellName](player,...);
}