Thanks for all the advice. Here’s what I ended up doing as of now.
The buyer got initial approvals from BofA higher-ups to approve their loan. We’ve agreed on an addendum to extend escrow by 7 days. They’re going to pay me a set fee per diem for each day until escrow actually closes, to cover my costs (so if it actually takes 5 or 9 days, I get 5 or 9 days additional payment).
In addition, I sent them a Notice to Perform with 48 hours to remove all contingencies. They have stated they will do so, so that their earnest money deposit is now losable if their loan falls through again. I’m sending them a Notice to Perform for completeness sake.
It seems like a reasonable compromise, while still allowing me recourse. If they fail to fund their loan and close by the new escrow date, I have the option of sending them a Demand to Close Escrow with 72 hours notice. If they are unable to close at that point, I’ll keep their earnest money deposit and relist.