If you understand operation of sequential and combinational circuits, explanation of blocking and non-blocking is self-explanatory. In sequential circuits, we just want outputs of many memory elements(flops, registers) to be updated simultaneously on valid clk edge, so non-blocking assignments are required.
In combinational circuits, assignments have dependency on previous assignments. So next instruction executes after current one and execution takes place in same way as control passes in high level languages such as C/C++.