Gnome 3.38 on latest release

I would not rule it out completely. Just like on traditional distro, you can install older versions of packages at your own risk. And you need to make sure all software is compatible.

And the benefit of NixOS is that you can do all of that declaratively, trivially build a VM image to test it or just deploy it and rollback if it does not work.

I would expect the following untested NixOS module you can just incorporate/import into your system configuration will get you pretty far.

{ pkgs, ... }:
let
  # Revision from https://4shells.com/nixdb/pkg/gnome3.gnome-shell/3.38.2
  pkgs-stable = import (pkgs.fetchzip {
    url = "https://github.com/nixos/nixpkgs/archive/7138a338b58713e0dea22ddab6a6785abec7376a.zip";
    # Please update this hash with the one nix says on the first build attempt
    sha256 = "0000000000000000000000000000000000000000000000000000000000000000";
  }) { };
in
{
  disabledModules = [
    "services/x11/display-managers/gdm.nix"
  ];
  imports = [
    "${pkgs-stable}/nixos/modules/services/x11/display-managers/gdm.nix"
  ];

  nixpkgs.overlays = [
    (final: prev: {
      gnome = prev.gnome.overrideScope' (finalGnome: prevGnome: {
        gnome-shell = finalGnome.callPackage "${pkgs-stable}/pkgs/desktops/gnome-3/core/gnome-shell" { gnome3 = finalGnome; };
        gnome-session = finalGnome.callPackage "${pkgs-stable}/pkgs/desktops/gnome-3/core/gnome-session" { gnome3 = finalGnome; };
        gdm = finalGnome.callPackage "${pkgs-stable}/pkgs/desktops/gnome-3/core/gdm" { gnome3 = finalGnome; };
        mutter = finalGnome.callPackage "${pkgs-stable}/pkgs/desktops/gnome-3/core/mutter" { gnome3 = finalGnome; };
      });
      # Alias for the gdm module.
      gnome3 = final.gnome;
    })
  ];
}