Figured it out. This change is the culprit:
https://bugzilla.mozilla.org/show_bug.cgi?id=723248
("add support for closing inactive databases (folders)")
The problem is that folders that are unused for 3 seconds or
more are closed. (Really? Is it really necessary to close
folders so quickly? Do they take up that much memory? Doesn't
this impact performance in terms of forcing Thunderbird to
constantly reopen closed folders?)
The code in nsMsgLocalMailFolder::UpdateFolder doesn't
generate a FolderLoaded event if it has to open a closed
folder; it only generates a FolderLoaded event when updating
the database of a folder that was already open.
I think the logic in nsMsgLocalMailFolder::UpdateFolder is
probably wrong, and a FolderLoaded event should be generated
when a folder is opened, not just when it is updated.
In any case, I've figured out a workaround for my add-on
(calling my code directly periodically, rather than relying
on a FolderLoaded event to trigger my code), but of course
it's going to be several weeks before the fix makes its way
through the AMO review process, so I guess in the meantime I
need to go flag my add-on as incompatible with TB15. *sigh*