If I recall off the top of my head, the level labels created in 'auto' mode are different than those created in 'manual' mode (i.e. with clabel()). In the latter case, the labels are actual text() objects. In the mode that you describe, the labels are actually undocumented private properties of the contour object. If your goal is to manipulate individual labels, there is no intended way to do it.
That said, you can try some things.
[c,hc] = contourf(X,Y,Z,'ShowText','on');
ht(k).Font.Weight = 'normal';
ht(k).Font.Name = 'courier';
Note that a few properties can be set within limits, but size becomes an issue. The gaps in the contour lines for each label are fixed and independent of the textprim object properties. If you make the text significantly larger or smaller, they may become a problem.
How are these gaps set? The contour object also has edgeprim objects which create the contour lines themselves.
he(4).StripData = uint32([1 10:15 22 33 38]);
he(4).VertexData(:,21:22) = [-0.55 -0.35; 1.17 1.05; 0 0];
Note now that I didn't run this in the forum editor, and I'm posting actual screenshots. The problem with this example is twofold. First, the selection of each particular contour line and vertex varies with figure size and other particulars. This makes working in the forum editor difficult, and it means that if you run this example code, the results won't be the same. That's probably expected, but the bigger problem is that all of these edits to private objects are volatile. If you try to zoom or pan in the figure or force any redraw, they'll all be reset. This also means that you can't use canonical methods like saveas() or print() to save the figure. That severely limits the practical usefulness of any of these workarounds.
Let's say you were willing to use clabel() to create manual labels instead. The labels would then be regular text objects and would be updated correctly. Some properties could be set directly, but others may still require extra work. See the following examples.
FWIW, all properties of an object (including the hidden ones) can be seen by casting it as a struct. It's a mess to wade through, and a lot of things might have unintended consequences when edited.