El problema es que tienes un while dentro de otro, así se multiplican los checkbox.
podrías probar algo así:
Leer las categorías
Leer las categorías del usuario
Hacer un array con las caregorías y marcar con 'true' las que tiene asignadas el usuario
Un bucle con el array para imprimir los checkbox
Código PHP:
Ver originalwhile($Nivelesrow=$consultaNiveles->fetch(PDO::FETCH_ASSOC))
{
$user_cat[$Nivelesrow['IdNivel']] = [
'id' => $Nivelesrow['IdNivel'],
'nombre' => $Nivelesrow['NombreNivel'],
'asignado' => false
];
}
...
while($Asignarow=$consultaNivelesAsig->fetch(PDO::FETCH_ASSOC)){
$user_cat[$Asignarow['Nivel']]['asignado'] = true;
}
foreach ($user_cat as $categoria){
if($categoria['asignado'] == true{
...
}else{
...
}
}