The difference between the two is that the design of case 1 is called behavioural modelling and that of case 2 is called data flow modelling.
Other than that the functionality is the same.
Case1 - "b" is a reg, Case2 "b" is a wire (you probably know that anyway). Functionally - meaning HW wise they are same. In simulation you may see some difference in 0-time behavior as the "always" block doesn't have to get executed at time 0 where as a continuous assign should. IIRC, tools used to have +always_trigger or some thing like that to avoid it, but lot of it is now outdated.