How to get each byte in byte array out and be able to work with them on their own?
Sorry if this sound patronising, its not meant to, I'm just trying to cover all aspects.

byte[] myByte = {"HelloOne", "HelloTwo", "HelloThree", "HelloFour"};
WriteAsync(myByte);


You are assigning 4 strings to the array mByte.  A string (lets ignore the Arduino type string for now) is a char* or a char[], so:

char hello1[] = "HelloOne";
char hello2[] = "HelloTwo";
char hello3[] = "HelloThree";
char hello4[] = "HelloFour";


(You don't need to do this in the code, how you have done it is fine, it just shows what you are really saying)

In English mByte should be an array of strings which in code is

char* mByte[] = {"HelloOne", "HelloTwo", "HelloThree", "HelloFour"};


You could do it as 

char mByte[][] = {"HelloOne", "HelloTwo", "HelloThree", "HelloFour"};//ERROR


But this won't compile, because the inner array (the text) is different length and the compiler doesn't like that.

Assuming that writeAsync takes a byte as a parameter then the code to write the data becomes this:

for (int stringCounter = 0; stringCounter &lt; 4; ++stringCounter)
{
    // get a pointer to the first element of the string
    // &amp; means get the address (so the value can be set to a pointer)
    // (byte*) means cast (change) the value into a byte pointer.
    byte* currentLetter = (byte*)(&amp;mByte[stringCounter][0];)
    // currentLetter != NULL means the pointer is not equal to NULL, because looking at a null pointer will crash the code.
    // *currentLetter != NULL means the thing pointed to by currentLetter is not the end of the string.
    while (currentLength != NULL || *currentLength != NULL)
    {
        // Write the thing pointed to by the pointer to the function.
        writeAsych(*currentLetter);
        currentLetter++;  // Move on the pointer
    }
}


Sorry I can't compile that at the moment, but it looks about write.  I hope it helps you understand it.