Il controllo e' assai ingarbugliato... per come e' fatto vengono sempre eseguiti anche i due else delle condizioni non verificate... ovvio che funzioni solo con l'ultima opzione!

Inltre usi il nome della variabile uguale al nome della select (devono essere univoci) e ricavi il valore in modo errato.

Ecco il tutto rivisto e semplificato:
codice:
function scelta_ricerca()
{
   var f = document.ric_trucchi;
   var wtipo_ricerca = f.tipo_ricerca.options[f.tipo_ricerca.selectedIndex].value;

   // disabilito tutto per default
      f.datadal.disabled=true;
      f.dataal.disabled=true;
      f.categoria.disabled=true;

   //opzione uno
   if(wtipo_ricerca == "data")
   {
      f.datadal.disabled=false;
      f.dataal.disabled=false;
   }
   //opzione due
   if(wtipo_ricerca == "categoria")
   {
      f.categoria.disabled=false;
   }
   //opzione tre
   if(wtipo_ricerca == "data_categoria")
   {
      f.datadal.disabled=false;
      f.dataal.disabled=false;
      f.categoria.disabled=false;
   }
}
ciao