I don't see the problem. The OBi will use the best match rule and "!1242xxxxxxx" is a better match than "1xxxxxxxxxx". The sequence of the rules don't matter.
You can test and avoid charges by temporarily routing the call to the OBiTalk network. If you are routing the call to the primary route, change Phone Port outbound call route rule "{(Mpli):pli}" to "{(Mpli):pp}". If the call is rejected in the Phone Port digit map, you will get a busy. If the call is routed to OBiTalk, it will fail and you will also get a busy. If the call fails in the Phone outbound route, you get a message "No routes available". Check the call history to see if the call is routed to ObiTalk. Only calls routed will show in the history, so calls rejected by "!" will not show in the history. I would start testing with only rule "!1242xxxxxxx".
I don't use the "!" operand, but I did some testing a long time ago. If I remember correctly the not operand doesn't actually reject the call, it is treated as a non-match.
If you have the following:
{(Msp2):sp2},{(Mpli):pli}
If you get a match in Msp2 with a "!", it will be treated as a non-match and the call won't be routed to SP2. Processing continues and if you get a match in Mpli the call will be routed to the primary line.
If the "not" rule is copied into the Phone Port digit map by rule "(Mpli)", the call should be rejected there and the outbound call route won't be processed.
Edit:
If you can't get this to work, you can use another method. Add the following to the beginning of the Phone outbound route:
{(1(24[26]|26[48]|284|345|441|473|649|664|721|758|767|784|8[024]9|86[89]|[89]76|900)xxxxxxx):}