No tiene ningún sentido ni tener onclick="this.value" ni tener una función en el value de los options.
Lo que podrías hacer es:
1. Guardar los datos de los productos en un array independiente.
2. En el option meter sólo el id (sku) y en el select poner la llamada a mostrar en el onchange.
Algo de este tipo o parecido:
Código PHP:
<script>
productos = [];
</script>
<select name="caja" id="caja" onchange="mostrarProducto()">
<option value="-1">Sin seleccion</option>
<?php
while ($row = mysql_fetch_array($cajas)) {
$precioIva = $row[product_price]*1.16;
$precioIva = round($precioIva*100)/100;
?>
<option value="<?php echo $row[product_sku];?>"><?php echo "$row[product_s_desc] - $precioIva"; ?></option>
<script>
productos['<?php echo $row[product_sku];?>'] = {
sku: '<?php echo $row[product_sku];?>',
precioIva: '<?php echo $precioIva?>',
desc: '<?php echo $row[product_desc] ?>'
};
</script><?php } ?>
</select>
La función mostrarProducto() podría llamar a tu mostrar() (aunque sería mejor modificar tu función mostrar directamente):
Código:
function mostrarProducto() {
var seleccionado = document.getElementById("caja").options[document.getElementById("caja").selectedIndex].value;
mostrar(productos[seleccionado].sku,productos[seleccionado].precioIva,'caja',productos[seleccionado].desc);
}