It has nothing to do with blocking assignments in the always block. The problem stems from the signal assignments being inside an always block, which means that must be declared as reg in the older Verilog standards (in SV you can use logic).
You would declare the ports with output reg a, etc.
FYI there is no point in synthesizing this as the code will result in the constants a=0, b=0, c=1, and d=1 being output on the pins. There will be no cycling through the values you specified. Besides that the #50000 is ignored by synthesis.
If you want to sequence through outputs you will need a clock, counters, and an FSM to determine when to send out the next value.