It looks like when deoplete invokes python3 it’s getting python3Packages.pynvim (see this line). I can neovim.override to override the wrapper arguments but I can’t figure out how to get at the callPackage arguments (where I could fiddle with python3Packages).
Ideally I’d do this in a way that is local to the neovim derivation (i.e. without overlays). Specifically I’d like a single file that looks like:
# neovim-with-new-msgpack.nix
{ pkgs }: /* your solution here */
So I had a look at how Neovim is done in pkgs/top-level/all-packages.nix and it seems to put the wrapper.nix you linked into wrapNeovim and then calls wrapNeovim with neovim-unwrapped (from default.nix in the same folder as wrapper.nix). Something like this might work but I haven’t tested it at all and it is nearly 2am: