I think you need to stop, take a step back and think about what you are doing - because you currently appear to be trying things at random and hoping they will work.
"But myArr2 contains numerical data. It contains double values."
No, it doesn't:
String[] myArr2 = (String[])arrList2.ToArray(typeof(string));
That declares MyArr2 as an array of strings - it doesn't matter that teh values you put into it are the string representation of double values: C# is strongly typed and will not convert them for you. If you say "I want strings" then strings you get, and strings they stay until you explicitly change them to something else - which you can't do with a cast, you need to parse them as a number and convert them that way.
And you can't subtract strings, because it makes no sense: what is teh value of "Hello" minus "Goodbye"?
This may sound like a stupid restriction when you
know they are numeric values, but it's actually one of the strengths of C# over weakly typed languages like VB: you are in control and you get what you ask for, not what the compiler thinks you might be trying to get./ Which means that problems like accidentally trying to subtract "Goodbye" from "Hello" always get caught at compile time, not at run time - and are a lot easier to find and fix.
Now, try something a bit different: instead of having two different arrays (or Lists, or - Gawd help us - ArrayLists) and keeping then all in step, why not look at doing it properly, and constructing a class which holds the string "CANBusYellow" and the double value together and have a single List of the class which means that the string and it's value are kept together, so if you need one, you have the other? It's really, really, not difficult to do...