The answer turned out to be the compound directory. For some reason, externals checked out to a subfolder immediately under the root project, like "SharedLib", can have changes committed, no matter how much deeper the changes actually are. Externals checked out to a folder structure like "Externals/SharedLib" cannot. That also means that externals checked out from various sources into a single subdirectory (to avoid having to get an entire external when you only need one library) won't allow commits.
I'll make do. Now that I know it's an issue I'll adjust how externals are set up when I want to actually work with them and not just have them around.