isRotation and isSubstring method
Better string copy
You are over-complicating your string duplication. There is an easier way to do it using memcpy. First, simply copy the string:
memcpy(s3, s2, len2);

Then, simply copy the string again (this time, with an offset):
memcpy(s3 + len2, s2, len2);

Notice how the second copy doesn't have - in the last argument. With it like this, you do not have to manually copy the null character over afterwards as it will use the null character from s2.
Note that you can not do this as easily with strcpy as this function will copy the entire string, including the null character.

Not true substring
Your isSubstring function doesn't actually find the substring of a string very well. Take these two strings as an example:

abec abc


Your function would return true to these if these were passed in in this order. A simple fix to this would be to reset j to 0 every time a character is encountered that is not the right one.
while(s1[i] != '\0')
{
    if(s2[j] == s1[i]) {
        j++;
    } else {
        j = 0;
    }

    i++;            
}


Misc

Returning bool

return 0;


Why are you returning a number from a bool-returning method?

Clear up the for loop

int j = 0;
...
for(size_t i = 0; i &lt; (2*len2); i++)
{
    ...
    j++;
}


This is somewhat confusing. You should move the j declaration right above the for loop, and move the incrementing into the signature.

Refactor
The string duplication logic should be moved into an external function as to spread out the logic and make sure that every function is only doing what it needs to do and nothing else.

Braces
Always use them, even around single-line statements. They make your code more maintainable and less error-prone.

While to for loop
This:

int j = 0;
int i = 0;
while(s1[i] != '\0')
{
    if(s2[j] == s1[i])
        j++;

    i++;            
}


Can be written more cleanly as a for loop:
for(int i = 0, j = 0; s1[i] != '\0'; i++) {
    if(s2[j] == s1[i])
        j++;
}