Hay un par de concatenaciones .= que hacen que la select interior sea ilegible. También creo que el while($j<total) no termina nunca.
Me permito algunas modificaciones como ejemplo, modifica como quieras:
Código PHP:
<?php
$sql_marcas = "select marca from marcas";
$result = mysql_query($sql_marcas,$link) or die("Fallo en linea 4 ".mysql_error());
$num = mysql_num_rows($result);
if ($num)
{
$tabla = "";
while($datos = mysql_fetch_assoc($result))
{
$marca = $datos["marca"];
$sql_num ="select COUNT(*) from caracteristicas as ci, productos as p
where ci.marca='".$marca."' and ci.cod_itv=p.cod_itv; ";
$result_num = mysql_query($sql_num,$link) or die("Fallo en linea 18 ".mysql_error());
mysql_free_result($result_num);
$num_cantidad = mysql_num_rows($result_num);
$tabla .="<tr><td>$marca</td><td>$num_cantidad</td></tr>";
}
}
mysql_free_result($result);
?>
<table id="resultado"><?php echo $tabla;?></table>
A ver si marcha, un saludo