Bevel a curve.
Using method similar to Shrinking tube or bending a cone will make one quarter of torus using this technique and mirror to make rest.
Add two bezier circles,
Select one as The inner radius circle. In edit mode make the spline non cylic and remove and edit such that end up with a quarter circle.
Setting the radius of the each of the end points of this curve gives us the big an small torus radii.
The other will make up the rings of the torus.
In edit mode move the origin of circle from centre to "left side"
Select All
A and shift -1 in x direction
GX-1
This will ensure that when used as a bevel object for another curve (without offset) the origin point will always be on curve, thus ensuring our torus hole matches that of curve.
Now set this as the bevel object of inner circle
Add two Mirror modifiers one in X and one in Y to produce a standard torus
Set the bevel interpolation type to ease, now can adjust the radius of end points.
Note: without going into the maths of this, there will be a point where an ellipse cannot be maintained and will collapse into a cardiod or inflate to an oval.