First, setBlock() won't just lag the server super hard just because you use it, you just have to be careful using with large operations. For large operations, I at least recommend you set $direct and $update to false, so blocks don't get updated. So for example: $level->setBlock($position, new Stone(), false, false);
$direct is unused.(see below) Then you're doing it in the wrong way. Read the post again. P.S. @falk typo in your post! It should be "asynchronous" not "asyncronous".
Actually, it is merely deprecated, not unused. The core code still uses it everywhere. https://github.com/pmmp/PocketMine-MP/blob/master/src/pocketmine/level/Level.php#L1467 Context: https://github.com/pmmp/PocketMine-MP/blob/master/src/pocketmine/level/Level.php#L1435-L1437
With future API changes in mind, you should not do this, but instead prefer using: Code: Block::get(Block::STONE) This is because in the upcoming ALPHA6 update, block objects need to be initialized with certain properties, which must be passed in the constructor. In ALPHA6, Block types may also be overridden by plugins. For example a plugin could replace the Stone type in the global index with a custom Stone which is Fallable. Using Block::get() provides the ability to allow plugins to modify the behaviour, in the same way that Entity::createEntity() may return custom Entity types. The constructors should not be used directly unless you want to create a block type to register into the index. Same thing applies to item types and enchantment types.