As you noted, there is no prescribed release schedule. Releases are driven by the community via mailing list discussion threads when the community feels a critical mass of new features, improvements, and bug fixes are ready. The pattern does seem to be around every 80 - 100 days, with some outliers when particularly large features are waited for or highly-anticipated features are available.
The code is “locked” by the community member who assumes release manager (RM) duties for that specific release. You can see on our lists the process Jeremy followed for the ongoing MiNiFi Java 0.5.0 release vote that is occurring right now, or this thread  for the recent release of NiFi 1.7.0 that I RM’d. Once the decision to have a release is made, the release candidate is usually generated within a couple weeks. Code is accepted up to the proposed date, and the master branch is used for the release candidate, so there is not a formal “locking” process whereby the release is cut from a release branch as you may be used to in some enterprise projects.