Pues el motivo de que solo te actualizara uno, es el como estabas haciendo el UPDATE,
'UPDATE Vacas SET PreñadaVac='1' WHERE CodVac=@Cod', si no actualizas @Cod con el nuevo valor proveniente de tu cursor solo actualizarás el valor del primero, para eso es el INTO, es como si en código hicieras una asignación a la variable desde un recordset.
De todas formas, si quieres un consejo, cambia el cursor por una sola instrucción UPDATE, es más rápido de ejecutar, y aunque ahora tengas pocos registros y no notas diferencia, a la larga lo notarás, los cursores son siempre más lentos.
La SQL quedaría algo así:
UPDATE Vacas SET PreñadaVac='1' WHERE DateDiff(m,FechaInsVac,GETDATE())>=3 AND FechaInsVac IS NOT NULL
lo único es que queda menos claro que cuando lo haces con un cursor, aunque eso depende de quien lea el Procedimiento Almacenado
Un saludo