You could customize the Free Shipping Options freeoptions shipping module with the code in RED:
// disable only when entire cart is free shipping
if (zen_get_shipping_enabled($this->code)) {
$this->enabled = ((MODULE_SHIPPING_FREEOPTIONS_STATUS == 'True') ? true : false);
}
// bof: disable for certain products_id 27, 12, 14
if (!IS_ADMIN_FLAG) {
global $db, $cart;
// check if any Products are in the cart that cannot be Free Shipping
$chk_products = 0;
$chk_products += $_SESSION['cart']->in_cart_check('products_id','27');
$chk_products += $_SESSION['cart']->in_cart_check('products_id','12');
$chk_products += $_SESSION['cart']->in_cart_check('products_id','14');
if ($chk_products > 0) {
$this->enabled = false;
}
}
// eof: disable for certain products_id
if ( ($this->enabled == true) && ((int)MODULE_SHIPPING_FREEOPTIONS_ZONE > 0) ) {
Just change the products_id value to match your Products and you can add more as needed ...