Reflecting through the API, I think I found the source of the bug.
To index a page, LazyIndexer calls PageTextIndexDB().LoadPageTextData(pageID). The problem is, that method doesn't use the API to get the text of the page to index. It makes a direct database call. Specifically, it calls editGetPageTextData, and passes the page ID and the language branch.
Since it goes straight to the database rather than through the API, it doesn't do any fetching of the properties. I looked through the stored proc, and while I don't claim to completely understand it, I'm pretty sure it's not doing any property fetching at all.
So, my workaround is this --
I'll create a LongString property called "Searchable Text." I'll mark this property as searchable, but not display it in Edit Mode. On page publishing, I'll use the API (which does fetch) to write the contents of any searchable properties to this hidden field. This should give the indexing system a text string with the correct values in it to index.
If anyone sees anything wrong with this plan, let me know.