MIMT maxchroma() works in LCHab (or other polar models) to find the envelope of maximum chroma for a given L and H.
C = maxchroma('lab','l',L,'h',H);
[a b] = pol2cart(deg2rad(H),C);
Alternatively (or in combination with plot(), you can create a colored pseudoline using a dense scatter() plot. This might require much more plot points due the fact that the gamut boundaries are tangential to lines of constant hue in some places.
CT = lch2rgb(cat(3,L,C,H),'lab');
CT = permute(CT,[2 3 1]);
scatter(a,b,10,CT,'filled')
Regarding that last statement:
This is the boundary chroma map for L = 97.14, H = [90 120]
In LAB, the gamut boundaries pass through tangency with lines of constant hue (vertical lines in the above image). This isn't something that happens in LUV.
This means that for certain L and H, the actual gamut boundary is somewhere inside the envelope of maximum chroma. Since maxchroma() finds the chroma envelope in this polar space, it cannot represent these concavities. All it returns is the envelope.
Luckily for you, this probably won't be too noticeable. LAB only has this behavior near the yellow corner (mostly on the R=1 face), and the concavity is small.
If you really want to tighten it up, you can, but it would be more expensive. Consider the example doing both ways
C = maxchroma('lab','l',L,'h',H);
[a b] = pol2cart(deg2rad(H),C);
A = lch2rgb(cat(3,L,C,H),'lab','truncatergb','nogc');
A = rgb2lch(A,'lab','nogc');
[a b] = pol2cart(deg2rad(H),C);
You could reduce the impact of this extra conversion cycle by conditionally applying it only for cases where L>85.