It turns out, there is a subtle interaction between FileType events and the
actual ftplugin mechanism.
When the filetype is changed, all matching FileType events are run. As near
as I can tell, this is one of the first things to be done.
So the current "state" would include both the buffer-local mapping and the
b:undo_ftplugin necessary to undo it. This ...
Explaining the steps you can use to troubleshoot such issues.
First, you can use a command such as :au BufRead *.mm to inspect which autocmds exist for that particular extension. You can use that to double check that your configuration actually took effect. (Which it did in your case.)
Second, you can use command :verbose set ft? to inspect the filetype ...
You can use mysyntaxfile hook. E.g.
" in vimrc
let g:mysyntaxfile = '~/vimfiles/after/syntax/base.vim'
" in base.vim
Note that you don't need augroup and stuff, as synload.vim manages syntax files by its own.
If in specific you would like to avoid the mklink on Windows or symlinks on Linux/Unix/Mac, you can use small files for the specific languages that simply load base.vim.
The technique is recommended in :help :syn-files:
When a language is a superset of another language, it may include the other one,
for example, the cpp.vim file could include the c.vim ...
The reason for this is that both *.adoc and *.fr.adoc match for foo.fr.adoc, so both autocmds are run.
The documentation for autocmd patterns is at :help file-pattern; looking at it, doing a robust "match *.adoc but not fr.adoc" is a bit tricky (though not impossible). Personally, I would opt for just an if:
autocmd BufNewFile *.adoc
\ if ...