You can use a custom DisplayFunction
to modify styling of contour lines based on contour levels (using the tooltip labels to identify the contour level for each line):
ClearAll[displayFunction]
displayFunction[ordering_: ReverseSort, range_: {.1, 1},
directives_: {AbsoluteThickness[3 #] &, AbsoluteDashing[3 #] &, Opacity}] :=
Module[{labels = Rescale[#, MinMax @ #, range] & @
ordering@Cases[#, Tooltip[a_, l_] :> l, All]},
ReplaceAll[l_Line :> With[{lbls = Last[labels = RotateLeft[labels]]},
{## & @@ Through[directives @ lbls], l}]] @ #] &;
Examples:
ClearAll[f, g]
f[x_, y_] := x^3 + x y;
g[x_, y_] := - x y;
With default arguments displayFunction[]
modifies thickness, dashing and opacity directives based on contour levels in descending order:
Show[MapThread[
ContourPlot[#[x, y], {x, -1, 1}, {y, -1, 1},
Contours -> 15,
ContourStyle -> #2,
PlotLegends -> #3,
ContourShading -> None,
DisplayFunction -> displayFunction[]] &,
{{f, g}, {Red, Blue}, {{x^3 + x y}, {- x y}}}]]

Use displayFunction[Sort]
to make higher contour levels rendered with larger thickness/dashing/opacity:

Use displayFunction[ReverseSort, {.1, 1}, {Opacity}]
to change only opacity:

Use displayFunction[ReverseSort, {.1, 1}, {AbsoluteThickness[5 #] &}]
to change only thickness:

Use displayFunction[ReverseSort, {.1, .8}, {AbsoluteDashing[10 #] &}]
to modify dashing only:

You can use the last argument of displayFunction
to inject arbitrary styling directives. For example, use
displayFunction[ReverseSort, {.1, .8}, {AbsoluteThickness[3] &, Dashed &,
Dynamic @ Blend[{CurrentValue["Color"], Yellow}, #] &}]
to make the contour lines thick and dashed and blend the contour color with Yellow
based on contour levels:
