Amdahl's law says nothing about blocking operations.

Amdahl's law is about *parallelism*, not synchronous call semantics; so
long as the underlying platform's parallelism is sufficient, blocking
call semantics are perfectly acceptable. For that matter, "blocking" and
"nonblocking" call semantics may have nothing to do with the underlying
system's degree of parallelism; see Clojure's core.async, Erlang's BEAM,
and GHC's ThreadID implementation for examples of synchronous call
semantics which attain much higher concurrency than the number of cores,
and Node.js for asynchronous code which is bottlenecked by the event
reactor's single-threaded design.

Moreover, applications need *not* use evented designs throughout;
CPU-intensive operations will often benefit from cache coherency and
lack of scheduler overhead involved in linear computations, which can
actually *reduce* user-visible latencies.

TL;DR: runtimes play a major role in what designs you'll choose.