Básicamente la diferencia es que si usás AJAX necesitás consultar al servidor a intervalos regulares para ver si hay un cambio de estado (ejemplo, un mensaje nuevo si es un chat o un cambio en el score si es un juego, etc) para actualizar la info en el navegador del usuario. Y eso lo tenés que hacer con cada cliente conectado. Es lo que comúnmente se llama polling y no es muy eficiente.
Con sockets, en cambio, es el servidor quien se encarga de notificar a cada cliente conectado cuando se produce un cambio de estado, además de escuchar contínuamente la info que le envían dichos clientes.
Con socket.io esto sucede cuando el navegador soporta sockets, pero si no soporta sockets socket.io intentará usar polling vía AJAX u otras técnicas. Es decir, además de simplificar el trabajo con sockets provee diferentes soluciones para que tu app funcione en navegadores modernos y no tan modernos