I had same problem - with BYE also.
My "go around" was (replaced name of domain and IP of kamailio):

route[ACKBYE] {
#!ifdef WITH_MYFORWARD
if(($sht(forw=>$ft))=~$td){
$du=$sht(forw=>$ft);
}else if((($td=="name.of.company.com")||($td=="ip"))&&($si=="ip")){
$du=$sht(forw=>$ft);
return;
}
#!endif
return;
}

route[PSTNINVITE] {
#!ifdef WITH_MYFORWARD
if(is_method("INVITE")){
ds_select_dst("1","4");
$sht(forw=>$ft)=$du;
sl_send_reply("100","Trying");
route(RELAY);
exit();
}
#!endif

return;
}

Meaning - during invite, I store du (to allow more then one Asterisk behind kamailio)
and on ACK or BYE - I check td and si. Not sure I am correct, but it works from long time, although load is not high.
PS
You will need to set in the beginning
modparam("htable", "htable", "forw=>size=8;autoexpire=7200;")

and you need to put routes in proper places.