I'm saying you don't have to do it continually. The troop-redistribution-after-victory script for AI vs AI is called from simple_triggers, and the same is called for player-vs-AI from game menus. You can add an extra check in the script for faction relations, straightforward, no continuous triggers iterating over every single party on the map every second.
I've not yet looked at any of the Native code apart from the stuff relevant to Craftmod. That does sound like a better way to manage it, though.
Wanna come back to the Storymod team? We sure could use you. 
I'll contribute snippets when I can... which is hardly ever. Here's a snippet for your perusal.
#BoW: script_party_add_party_prisoners
# Troops that have poor relations with player will not join.
# INPUT:
# param1: Party-id to add the second party
# param2: Party-id which will be added to the first one.
# reg1 : Faction of victorious party who will be collecting these liberated prisoners
# "$g_move_heroes" : controls if heroes will also be added.
("party_add_party_prisoners",
[
(store_script_param_1, ":target_party"), #Target Party_id
(store_script_param_2, ":source_party"), #Source Party_id
(assign, ":winner_faction", reg1), (party_get_num_prisoner_stacks, ":num_stacks",":source_party"),
(try_for_range, ":stack_no", 0, ":num_stacks"),
(party_prisoner_stack_get_troop_id, ":stack_troop",":source_party",":stack_no"),
(this_or_next|neg|troop_is_hero, ":stack_troop"),
(eq, "$g_move_heroes", 1),
(party_prisoner_stack_get_size,":stack_size",":source_party",":stack_no"),
# Added in BoW:
(store_troop_faction, ":troop_faction", ":stack_troop"),
(store_relation, ":troop_relation", ":troop_faction", ":winner_faction"),
(try_begin),
# "amoral" troops will join you regardless of your standing with their faction
(this_or_next|eq, ":troop_faction", "fac_outlaws"),
(this_or_next|eq, ":troop_faction", "fac_commoners"),
(this_or_next|eq, ":troop_faction", "fac_innocents"),
(this_or_next|eq, ":troop_faction", "fac_neutral"),
(ge, ":troop_relation", 0),
(party_add_members, ":target_party", ":stack_troop", ":stack_size"),
(else_try),
(party_add_prisoners, ":target_party", ":stack_troop", ":stack_size"),
(try_end),
# End BoW: (try_end),
]),
Usage example: in module_simple triggers.py, under ti_simulate_battle... addition of a single line makes the above work. You can see Armagan already intends to do the same thing since he has code reading the party faction but he doesn't do anything with it yet.
(store_faction_of_party, ":faction_receiving_prisoners", ":nonempty_winner_party"),
(store_faction_of_party, ":defeated_faction", ":root_defeated_party"),
(party_clear, "p_temp_party"),
(assign, "$g_move_heroes", 0), #heroes are already processed above. Skip them here.
# BoW:
(assign, reg1, ":faction_receiving_prisoners"),
# End BoW:
(call_script, "script_party_add_party_prisoners", "p_temp_party", ":collective_casualties"),
You'll have to do a search for call_script, "script_party_add_party_prisoners" to set the faction of the receiving party for each call, but it's just 1-2 lines extra each time this call appears (about 4-5 times in module_game_menus.py).