Bon je me réponds à moi-même.
Comme je tournais en rond et que ça me gonflais j'ai utilisé une autre méthode.
D'abord j'utilise maintenant des cases à cocher pour sélectionner les groupes que je veux affecter (ça marche aussi avec des boutons radio).
J'utilise quand même l'arbre du champ "user_groups" mais je le place en position hidden pour que l'utilisateur ne le voit pas (mon administrateur de site) et ne fasse pas de bêtise en sélectionnant n'importe quoi.
Dans mes champs case à cocher j'utilise jquery pour savoir si la case est cochée et en fonction de ça j'active ou pas la case à cocher correspondante dans l'arbre du champ user_groups (caché en position hidden).
Exemple :
si ma case à cocher "Groupe A" est cochée alors :
jQuery('#ID_de_la_case_dans_l_arbre_user_groups').get(0).checked = true;
sinon
jQuery('#ID_de_la_case_dans_l_arbre_user_groups').get(0).checked = false;
Ainsi de suite pour ma case à cocher "Groupe B", etc.
De cette façon seuls les groupes souhaités apparaissent sur le formulaire, il ne peut donc pas y avoir de "mauvais" groupe (admin par exemple) ou d'abus.
Cette solution peut-être utilisé dans le cas ou des membres devraient choisir eux-même leur affectation.
Si ça peut aider en attendant mieux... Je ne marque pas le sujet comme résolu car j'estime qu'il doit y avoir une solution plus simple et plus "Seblod" pour ce problème.
(autre détail c'est un peu ch... de se retaper un message dans le forum parce qu'on a mis un peu trop longtemps à le saisir. Y a t'il un moyen de rallonger le délai de session ?)
A+