Why does unzip_file always return true but nothing happens?

In PHP, in too many contexts, false and true are more of a state of mind than actual values and not false is not the same as true If you want to check that something is a boolean true, then just check if it is === true.

In your case the function returns a WP_Error object which is not a boolean value at all and it probably includes the reason for the failure.

As for the actual reason for failure, it means you do not have permissions to write to the location you want to write to.