Así debería funcionar.
El DISTINCT hace que no se repita la misma categoria.
Código PHP:
$codigo = $_SESSION["id"];
$consulta = "SELECT DISTINCT(cat_id), categoria FROM Users
JOIN panel ON Users.id = panel.id_user
RIGHT JOIN cat ON id_cat=cat_id
WHERE Users.id=$codigo";
$query = mysql_query($consulta);
while ($row = mysql_fetch_assoc($query)) {
// Muestro nombre de la categoria
echo $row['categoria'] . " <br/> ";
$idcategoria = $row['cat_id'] ;
$sql_archivos = "SELECT * FROM panel
WHERE id_cat=$idcategoria AND id_user = $codigo";
$query_archivos = mysql_query($sql_archivos);
// Muestro los titulos de archivos para la categoria actual
while ($fila_archivo = mysql_fetch_assoc($query_archivos)) {
echo $fila_archivo['titulo'] . "<br>";
}
}
Saludos