It's worth thinking about operating systems in general. Linux for instance is really a kernel, when you install a copy of Linux, you're installing more than the kernel, you're installing a distribution.
The kernel is the software that runs directly against the hardware, telling it what to do, managing what to do with I/O and all the data flowing through the system, deciding how to manage the memory etc.
The shell in the operating system sits around the kernel and allows interaction to it. For instance, if you SSH to a ESXi host, you'll be running a command line shell, in which you can run applications (such as ls, esxcli). These programs, as well as guest virtual machines all interact with the kernel's APIs to request or receive data.
VMKernel specifically is a POSIX-styled (in a similar vein to UNIX, Linux, *nix in general) kernel. There are many conventions that are used in POSIX systems which administrators will find familiar in ESXi. The idea of loading kernel modules for-instance.
ESXi could not exist without the VMKernel at the core, but likewise, the VMKernel on its own wouldn't be very useful as ultimately, you need some-way of interacting with that (either as a user, or as another program/system).