Thanks for the updated info about the charge rules. I have an idea that could get this working for you but it will require a little bit of editing of your rules to add in a new condition.
The idea is that you set a new session variable, this session variable can be called something like pick_up. You should set this session variable on the cart display page and default it to 0. You will then have another set of this code that will be very similar but the trigger will be the checkbox that the user checks for pick up.
Then on the cart page you can have your checkbox to indicate pick up instead of shipping, when the user checks this box and submits the page your set session value server behavior will set the value of the pick_up session variable to 1.
You will then need to update the charge rules to check this session variable and ensure that it has a value of 0 in order to make the charge.
If you set the checkbox to be checked based on the value of this session variable it will represent weather or not the user has made that choice. The last thing you will need is another set session server behavior like the one that sets the variable when the box is checked. This time though you will need to check the value of the check box and if it does not have a value set the pick_up variable back to 0.
This is just one way you could do it but I think it would fit your situation. If you have any questions or would like any clarification on any part of this please let us know.