Use a data-driven design
The problem with the way you wrote your program is that it doesn't scale. What if you want to add more units, say metric tons, or stones? What if you want to support ALL the SI scaling prefixes, like nano, micro, mega, giga, and so on?
There are two things that will greatly simplify your code. First is to use a data-driven design: instead of creating a function for each type of conversion, write one function that can convert things, and add a data structure that holds the information that this function would need to perform the conversion. The second thing is to not add all possible combinations from one unit to another, but to only add conversions from an arbitrary unit to a base unit, like from any length to meters. If you want to convert from inches to miles, you first convert from inch to meters, then convert from meters to miles.
Here is what the data structure could look like:
#include <unordered_map>
#include <string>
std::unordered_map<std::string, double> units = {
{"meter", 1.0},
{"centimeter", 0.01},
{"inch", 0.0254},
{"mile", 1609.344},
...
{"kilogram", 1.0}, // kilogram is the base SI unit, not grams
{"gram", 0.001},
{"pound", 0.4536},
...
};
And then you can write a single function that can convert from any unit to any other unit:
double convert(const std::string &from, const std::string &to, double value) {
return value * units[from] / units[to];
}
Of course the above function is very simplified, it does not check if the given unit names are actually known, and also incorrectly allows converting from inches to pounds, so a bit more work is necessary to add input validation.
Avoid unncessarily passing parameters by reference
I see that in some (but not all) of the functions, you pass doubles by reference. For parameters that are only read from, this is not efficient. Simple types like ints and doubles should be passed by value. Only larger types like structs with several member variables should be passed by const reference.
For the parameters that are written to you of course need to pass by reference, although it is also possible to just return them by value.
While you can only return one thing at a time, if you want to return two values you can work around that restriction by returning a std::pair for example.
Avoid having function do too many things at once
Your calc...() functions take two units in and write two units out. However, it is a bit confusing: it assumes the input has to be summed somehow and then convert to two units. But if you sum the output it is actually twice that of the input. Even worse, the conversion factors are not very exact, which leads to more problems. To give an example: by using calcLength_ft_inch() to convert 1 meter and 80 centimeters, the output is 5.9048 feet and 70.8576 inch. But if you convert 5.9048 feet and 70.8576 inches back to meters and centimeters with calcLength_m_cm(), you get 3.4578088 meters and 345.785088 centimeters.
Keep things simple, and only convert one thing at a time, and make sure you do that well.