Is is possible to apply such an algorithm to an arbitrary parametric curve?
Here's a way to plot them:
div = #/Last@# &@ Accumulate@ Range[0, 50];
plot = ParametricPlot[{t Cos[4 t], t Sin[5 t]}, {t, 0, 2 Pi},
MeshFunctions -> {"ArcLength"}, Mesh -> {div}, MeshStyle -> Red]

One can get the points with the following; but plotting is not a very accurate solver and the mesh points are generated out of order:
pts = Cases[Normal@plot, Point[p_] :> p, Infinity]
For a nonsingular parametrization, one can integrate the parameter t as a function of arclength. Then one can get accurate values for the points in order:
param = {t Cos[4 t], t Sin[5 t]};
tdom = {0, 2 Pi};
tIF = NDSolveValue[{
t'[s] == 1/Sqrt[#.#] &[D[param, t] /. t -> t[s]],
t[0] == First@tdom,
WhenEvent[t[s] == Last@tdom, "StopIntegration"]},
t, {s, 0, Infinity}];
pts = param /. t -> tIF@Rescale[div, {0, 1}, First@tIF@"Domain"] // Transpose;
Show[
plot,
Graphics[{Orange, PointSize@Large, Point@%}]
]

Response to updated Q (as well as some of the comments):
The OP seems particularly interested in a general way to subdivide an interval {a, b} such the lengths of the divisions are in an arithmetic progression specified by the number of subintervals and the ratio of the longest and shortest lengths (the first and last lengths). One can work out a formula with HS algebra, but one could also leave the work to Rescale as above. One can start from an arithmetic sequence of lengths from 1 to the ratio and generate the subdivision from there:
Subdivide[1, r, n - 1] // (* arithmetic sequence of lengths *)
Prepend[0] // (* prepend zero so Accumulate includes endpoint *)
Accumulate // (* relative divisions *)
Rescale[#, MinMax@#, {a, b}] & (* rescale to interval {a, b} *)
Compare with div and rescaling it to get the second pts above.
Here's a function that has a few bells & whistles: It computes either increasing or decreasing lengths; it maintains the precision of the input; it produces a packed array when the input precision is MachinePrecision.
ClearAll[withWP];
SetAttributes[withWP, HoldRest];
withWP[wp_, code_] := (* set up environment for a fixed working precision *)
Block[{$MinPrecision = wp, $MaxPrecision = wp}, code];
ClearAll[divisions];
divisions[{a_, b_}, r_?(GreaterEqualThan[1]), n_Integer?(GreaterThan[1])] :=
withWP[Precision[{a, b, r}], (* working precision determined by input *)
Subdivide[N[1, $MaxPrecision], r, n - 1] // (* arithmetic sequence of lengths *)
Prepend[N[0, $MaxPrecision]] // (* prepend zero to include endpoint *)
Accumulate // (* relative divisions *)
Rescale[#, MinMax@#, {a, b}] & // (* rescale to interval {a, b} *)
If[TrueQ[a > b], Reverse, Identity] (* decreasing div. lengths if a > b *)
];
Examples of divisions[interval, ratio, n]:
divisions[{a, b}, 2, 2] (* symbolic subdivision *)
(* {a, a + 1/3 (-a + b), b} *)
divisions[{5, 0}, 2, 2] (* decreasing lengths *)
(* {0, 10/3, 5} *)
divisions[{2., 9.}, 2, 4] (* increasing lengths *)
Ratios@ MinMax@ Differences@ %
#/Min[#] &@ Differences@ %%
(*
{2., 3.16667, 4.72222, 6.66667, 9.}
{2.} ratio = 2
{1., 1.33333, 1.66667, 2.} OP's L1:L2:L3:L4
*)
divisions[{2., 9.}, 2, 4] // Developer`PackedArrayQ
(* True *)
#/Min[#] &@ Differences@ divisions[{2., 9.}, 10, 4]
(* {1., 4., 7., 10.} ratio of lengths...
OP gets L1:L2:L3:L4=1:3.33:6.67:10 but I think this is correct *)
If you do the algebra, you can shorten divisions:
divisions2[{a_, b_}, r_?(GreaterEqualThan[1]), n_Integer?(GreaterThan[1])] :=
withWP[Precision[{a, b, r}], (* working precision determined by input *)
((n - 1)/(r - 1) - 1/2 + Range[N[0, $MaxPrecision], N[n, $MaxPrecision]])^2 //
Rescale[#, MinMax@#, {a, b}] & // (* rescale to interval {a, b} *)
If[TrueQ[a > b], Reverse, Identity] (* decreasing div. lengths if a > b *)
];