If I copy and paste the numbers you posted as shown below, the precision of the numbers is slightly less than 50, from 49.6 to 49.7, due to conversion from the ASCII representation:
{4.2381878739099146976942608527708919906248917152657*^6,
0.0048230113561383041835207418808668133329086696535244,
0.0048249194434038473837547000974380792009777840867437,
0.0048330661478961510678031863401831999702176813779798}
This has nothing to do with the main issue, but I felt it important to realize what numbers I am working with. If I export and import them, there is a further slight loss in precision, again due to the round trip conversion to and from ASCII. Again, this is not particularly important, since the precision is 47.6 to 48.7, a loss of 1-2 digits. It might be important to realize that in the conversion to ASCII, trailing zeros are omitted, and this translates to an extra precision loss equal to the number of zeros dropped. Whether this should be a significant concern depends on how the numbers are used in further calculations.
If I promote the precision of the numbers to 50 by adding a tick-50 at the ends, then the export/import loss of precision is the same as the copy-paste one, about 0.3–0.4 digits.
Export[FileNameJoin[{$TemporaryDirectory, "foo"}],
{4.2381878739099146976942608527708919906248917152657`50*^6,
0.0048230113561383041835207418808668133329086696535244`50,
0.0048249194434038473837547000974380792009777840867437`50,
0.0048330661478961510678031863401831999702176813779798`50}, "List"]
Import[FileNameJoin[{$TemporaryDirectory, "foo"}], "List"] // FullForm
In short, the data has only a minor loss of precision, nothing near the 34-digit loss you see in CForm[th0]. Let's look at CForm[]. First, th0 is a rational number (infinite precision). CForm[th0] is the CForm of a rational number (check with FullForm below). What you're seeing is the effect of typesetting the CForm of a rational number by the Front End. Try CForm[1/3] for a simpler example. For whatever reason (I did not find it mentioned in the documentation), what you get is a C double approximation of the rational number (update: SE Q&A on this topic). The upshot is that CForm[] is misleading you as to the precision of th0.
initvalues = SetPrecision[Import[FileNameJoin[{$TemporaryDirectory, "foo"}], "List"], Infinity];
th0 = First[initvalues]
(*Out[]= 1476792935618238128801055858742073436930432589667/348449143727040986586495598010130648530944 *)
CForm[th0] (* defaults to machine-precision form *)
(*Out[]= 4.238187873909915e6 *)
CForm[N[th0, 50]]
(*Out[]= 4.2381878739099146976942608527708919906248917152657e6 *)
CForm[th0] // FullForm
(*Out= CForm[Rational[
1476792935618238128801055858742073436930432589667,
348449143727040986586495598010130648530944]] *)
You might want to consider exporting the WL form of the numbers you wish to save. These are imported in the same form as they were exported. Of course, the files cannot be catenated, but I suppose that is unimportant.
Export[FileNameJoin[{$TemporaryDirectory, "foo"}],
{4.2381878739099146976942608527708919906248917152657`50*^6,
0.0048230113561383041835207418808668133329086696535244`50,
0.0048249194434038473837547000974380792009777840867437`50,
0.0048330661478961510678031863401831999702176813779798`50}, "WL"]
Import[FileNameJoin[{$TemporaryDirectory, "foo"}], "WL"] // FullForm
Alternatively, you might wish to store the extra guard digits. They will import with a higher precision than 50 (unless there are trailing zeros), but you could use SetPrecision[] to set the precision back to 50.
x = N[Pi, 50];
Export[FileNameJoin[{$TemporaryDirectory, "foo"}],
{First@StringSplit[ToString[x, InputForm], "`"]}, "List"]
Import[FileNameJoin[{$TemporaryDirectory, "foo"}], "List"] // FullForm