tu pourrais essayer ceci
GROUP_CONCAT crée une liste triée à partir des valeurs du GROUP BY (ici par région)
donc une liste des code_commune trié par population décroissante
SUBSTRING_INDEX coupe cette liste aux 100 premières valeurs
FIND_IN_SET va sortir tous les code_commune retournés dans les listes de la sous-requête
Je n'ai pas testé et je ne sais pas si avec 2 à 3000 communes par région, ça plante ou pas ?
Edit : pour booster la taille des listes (par défaut 1024 caractères)
SET @@group_concat_max_len = 1000000;

