I came up with a solution that works for me in the end:
I install my plugins using nix, without any reference to their config files:
programs.neovim.plugins = with pkgs.vimPlugins [telescope.nvim oil-nvm ...];
Then I place my plugin configuration files (these contain the equivalent of the ‘config’ function for a Lazy plugin install) in nvim/plugin, where nvim is my neovim lua directory. It gets symlinked to the correct location in default.nix with:
home.file."./config/nvim" = {
source = ./nvim;
recursive = true;
};
nvim/plugin is automatically run by neovim on startup as part of its runtimepath, so all my plugins config files are run when I start neovim.
In this way I can maintain all the configurability of a regular neovim installation, but install my plugins with nix.