As @fooman pointed out there is no way to dynamically re-query Magento for shipping rate selection. Due to this many companies elect to remove the button on the cart and instead provide it as an option on the first part of the checkout. You can also elect to have a modal window prompt for the shipping destination zipcode (or even the entire shipping address) before whisking away to Paypal.
However, most of this is terse to the customer because they're electing to use Paypal which theoretically would have most of that information already stored.
So the preferred solution is to configure Default Tax Destination Calculation
setting. As mentioned by @fooman this is located in System > Configuration > Tax > Default Tax Destination Calculation
and will provide all quotes the default tax unless specified otherwise during checkout.
The customer group method would certainly be the cleanest, but if you are already using the groups for other purposes, you can do it programmatically as you suggest.
You would be looking to set the tax_percent, tax_amount, and base_tax_amount on the quote item.
If you do this by over-riding the tax total collector you can over-ride the percentage in:
Mage_Tax_Model_Sales_Total_Quote_Tax::_aggregateTaxPerRate()
You'll see $item->setTaxPercent($rate);
towards the top. Further down you'll see
$item->setTaxAmount(max(0, $rowTax));
$item->setBaseTaxAmount(max(0, $baseRowTax));
After which you can over-ride the raw amounts.
The advantage in doing it in the collector is that you don't have to also deal with all of the row totals and overall totals on the quote object, they'll adjust automatically. The downside (potentially a big deal) is that you're doing an over-ride deep in the heart of Magento and you'll have to diff the method every time you upgrade to ensure that you're not missing bug fixes or causing a regression on upgrade.
The advantage of using the observer would be that you're more upgrade proof, but you'll have to reset the row totals and overall totals on the quote object (5-10 additional fields).
Best Answer
I think this is not possible out of the box.
The intuitiv way: Creating a configurable and two simples one with tax and one without won't work, because for the price calculation only the price and tax setting of the configurable is used.
I think there are two ways to achieve this: