I was still getting freezes on 8.1.1, so doing that update isn't guaranteed to always fix it.
In order to rule out a hardware fault (especially since mine has TLC), I decided to start completely fresh to see if it would still happen on a clean install. So far, no crashes!
It's early days, so I'll post back again in a week, but it's looking very much like this is a software bug rather than a hardware problem. Doing the 8.1.1 update obviously fixes it in most cases, but not all, in which case starting over from scratch and not restoring a backup appears to resolve it.
In my first attempt, when I restored from an iCloud backup, the problem persisted on 8.1.1, so some combination of configuration options or temporary files that are carried over from the backup must be what's required to trigger the issue.