default is just a label (address to where the code jumps if n is not -1 or 0).Thus when n is not -1 or 0, the flow enters the body of the for loop skipping the initialisation of j. You can write the same code also as this, so it would be clearer what is happening here:
int m = n;while (--n > 0){ switch (n) { case -1: case 0: for (int j = 0; j < m; ++j) { default: printf(":-)"); } break; }}(Note, as mentioned by @alagner in the comments, it won't compile with C++ compiler but perfectly compiles with C one so this is good enough to make my point and explain how the code looks).
So yes, since j is uninitialised, it is undefined behaviour.If you enable compiler warnings, it will warn you about it (https://godbolt.org/z/rzGraP):
warning: 'j' may be used uninitialized in this function [-Wmaybe-uninitialized] 12 | for (int j = 0; j < m; ++j) | ^