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:
