I was going to suggest the book you mentioned, but as you mentioned it's not an description of the design process, it's a description of the system as designed.
I don't think I've seen a holistic document that tries to explain the whys of everything. You'd really need to just go through the history of changes, and look at contemporaneous mailing lists, announcements and conference presentations.
If you go back far enough, most of the algorithms are pretty basic. Lots of full array scans, which wasn't horrible because the arrays were tiny. The algorithms come from what was convenient at the time it became a bottleneck; lots of hashing, and then you increase the size of the hashtable because there's too many collisions (although sometimes that gets silly --- it doesn't make a lot of sense to hash port numbers when your hash table size is 64k, and it makes no sense to have a hash table size larger than that, because that's the size of the input space). And sooner or later you need to deal with having large numbers of cores all working on the same tables, and how that interacts with locking, NUMA, etc.
If there's some choice really puzzling you, you can probably ask on the freebsd-net mailing list, and get a reasonable answer.