I've found the answer here (and I'm slightly less embarrassed about asking a question that has a fairly obvious answer after finding two other people who asked the same question): https://github.com/mbdavid/LiteDB/issues/789
To quote:
"and do I need to call it EnsureIndex at every write operation?"
"I'm wondering the same thing. When exactly do you call EnsureIndex? Do you just use it the first time you add a new collection to a database to set up the indexes, or do you need to use it every time after calling GetCollection for example? The docs aren't very clear on this."
Answer by @mbdavid, who created LiteDB:
"you need call EnsureIndex before run a query to database create index IF NEEDED. If index already created (using same EnsureIndex), EnsureIndex will do nothing. So, to be pratic, be best place to create all your indexes are in database initialization"
Incidentally, I also learned something else in playing around with EnsureIndex() - it has a second parameter "unique", a bool value. So I'm guessing that setting this true (when relevant) improves efficiency a bit and also prevents inserting a new document with a non-unique index.
So now my creating of the LiteDB database collection looks like this:
// Get the collection (or create, if doesn't exist)
LiteCollection<YacksProjectInfo> yacksProjects =
liteDatabase.GetCollection<YacksProjectInfo>("YacksProjects");
// Index current and future documents using ProjectName and ModuleNumber properties
yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ProjectName, true);
yacksProjects.EnsureIndex((YacksProjectInfo x) => x.ModuleNumber, true);