C'e` una contraddizione:

if(!categoria.checked)
{
for(i=0; i<categoria.length; i++)
{
if (categoria[i].checked)

categoria dovrebbe essere una collezione di radio (mi pare) - allora non puoi testare categoria.checked. Lascia solo il loop per il controllo.

Tra l'altro potrebbe esserci un erorre nella definizione dell'oggetto categoria.

Il loop deve essere di questo tipo:

var tmp = 0;
for(var i=0; i<categoria.length; i++) {
if (categoria[i].checked) tmp++;
}
if(tmp == 0) {
alert('devi inserire il campo categoria!!!');
return false;
}

---

La funzione deve ritornare solo true o false (non mettere il submit dentro la funzione - ha effetti collaterali)

La funzione deve essere chiamata dal tag <form> in questo modo:
<form ... onsubmit="return ctr_campi2();">
(nota il return davanti al nome: in tal modo se ritorna false, il form viene fermato)

Poi ci deve essere un <input type="submit"> per inviare il form.