Why does mysql make delete offset?
The list is kept for MVCC (https://en.wikipedia.org/wiki/Multiversion_concurrency_control) as @jkavalik mentions in his comment. This is required for providing isolation for transactions  (https://en.wikipedia.org/wiki/ACID). A record cannot be deleted under you as long as you're in a transaction.

When you start a transaction (depending on your isolation level) you get a "snapshot" of the current state of the database. This is implemented in MVCC by TRX_ID which is being checked against your actual transaction id. If it's higher you cannot see that because it means it was updated after you started the transaction. 

Deleted (and also old versions of updated) records are picked up by a purge thread in the background as of MySQL 5.6. It used to be in the master thread and now the number of threads is configurable also (https://dev.mysql.com/doc/refman/5.5/en/innodb-improved-purge-scheduling.html)