A bit late answer but you can use hook_form_alter as you stated.
$localities = get_all_localities($term_id);
$localities_tids = array();
foreach ($localities as $tid => $name){
$localities_tids[] = $tid;
}
//alter the available options in the exposed filters
foreach ($form['term_node_tid_depth_i18n']['#options'] as $tid => $term){
if ( !in_array($tid, $localities_tids) ){
if ( $tid != 0 && !empty($tid) ) {
unset($form['term_node_tid_depth_i18n']['#options'][$tid]);
}
}
}
In this example I get all the localities (child elements) with parent $term_id, after that just compare the new tid's list with the id present on the form element and remove what u don't need using unset()
Will also leave you my example to get the child localities from the region parent id ($term_id).
function get_all_localities($regiao_selecionada) {
$lang_code = get_site_lang();
$loc_list = array();
if ( !empty( $regiao_selecionada ) && $regiao_selecionada != '0' ) {
$locs = db_query("
SELECT td.tid,
COALESCE((SELECT lt.translation FROM locales_source ls, locales_target lt WHERE ls.lid = lt.lid AND ls.context LIKE CONCAT('term:',td.tid,':name') AND lt.language LIKE '$lang_code' LIMIT 1), td.name) as 'name', th.*
FROM taxonomy_term_data td, taxonomy_term_hierarchy th
WHERE th.tid = td.tid AND td.vid = 5 AND th.parent = $regiao_selecionada AND td.name <> 'Foreign' AND td.name <> 'Nenhuma' AND td.tid NOT IN (select tid from taxonomy_term_hierarchy where parent IN (select tid from taxonomy_term_data td where td.name = 'Foreign' OR td.name = 'Nenhuma'))
ORDER BY td.name ASC
");
} else {
$locs = db_query("
SELECT td.tid,
COALESCE((SELECT lt.translation FROM locales_source ls, locales_target lt WHERE ls.lid = lt.lid AND ls.context LIKE CONCAT('term:',td.tid,':name') AND lt.language LIKE '$lang_code' LIMIT 1), td.name) as 'name', th.*
FROM taxonomy_term_data td, taxonomy_term_hierarchy th
WHERE th.tid = td.tid AND td.vid = 5 AND th.parent <> 0 AND td.name <> 'Foreign' AND td.name <> 'Nenhuma' AND td.tid NOT IN (select tid from taxonomy_term_hierarchy where parent IN (select tid from taxonomy_term_data td where td.name = 'Foreign' OR td.name = 'Nenhuma'))
ORDER BY td.name ASC
");
}
foreach ($locs as $id => $loc) {
$loc_list[$loc->tid] = $loc->name;
}
return $loc_list;
}
Hope this can help you out.