There is a way you can create a polygon with an inside buffer that reduces the river width based on a certain percentage directly based on the initial polygon shape, using QGIS expressions - either with Geometry generator or with Geometry by expressions (See here for details on both options).
Entering the expression in a new Geometry-generator type symbol layer, from the initial light blue polygon the dark blue version is created:

To achieve this, use the following expression. Based on your data, you might want to change the following values - with geometry generator, you can do this in real time to see how the result changes when adapting the values:
- The expression is based on a simplified version of the polygon to reduce complexity, make calculation faster an resulting polygons more compat: in case of very detailed shapes for the river polygon with many vertices, this reduces the no. of vertices. You might set the tolerance (in meters/layer units) at the end of line 6 (here: 1 - for further simplification, increase the number, to have no simplification at all, set the value to 0).
- change the value of 0.1 (end of line 16) to a distance significantly smaller than the minimal river width
- change the value of 100 (line 22) to a value larger then the largest river width. Be sure to include the minus sign to get negative values!
- change the value of 0.3 (8th last line) to change the size of the remaining polygon. 0.3 means that form both sides, it reduces the local width of the river by 30%, so for both sides = 30%+30% -> remaining 40% of the local width.
make_polygon(
make_line (
array_filter(
with_variable(
'river',
simplify( $geometry, 1),
array_foreach (
generate_series (1,num_geometries( nodes_to_points (@river))),
with_variable (
'line',
make_line(
geometry_n (nodes_to_points (@river), @element),
intersection (
difference (
boundary(@river),
buffer (geometry_n (nodes_to_points (@river), @element), 0.1)
) ,
make_line (
geometry_n (nodes_to_points (@river), @element),
project (
geometry_n (nodes_to_points(@river), @element),
-100,
radians (90+angle_at_vertex (boundary(@river), @element))
)
)
)
),
end_point (line_substring (@line, 0, length (@line)*0.3))
)
)
),
@element is not NULL
)
)
)