Why are most of the modules in Android statically liked to the kernel, rather than loading them dynamically?
Having a non modular kernel is a common practice in embedded systems. Unlike a Desktop/Server Machine, on a phone, the hardware is not likely to change, most of them do not have USB ports and hence there's no need to have kernel features/hardware support be loaded in form of modules.
You know the filesystem you want to use, the network interfaces that you need support for etc and all of this can be built into the kernel instead of having them loaded dynamically.
Criteria I use to decide what goes into kernel and what is built as modules - If there are features (like network interface support/filesystem support) which you need all the time, then include them in the kernel. If there are features which you would need only at certain points (like netfilter modules) build them as modules