finding separating words (Nerode)
There are systemic approaches to find the separating words (a.k.a. distinguishers).

However, for small instances of regular languages, I prefer to use plain argument in plain English sometimes. Let me use your case 1) as an example, where you have got all the equivalent classes correctly.

$L$ contains words that start and end with $aa$.
$S_1$ is the empty word.
$S_2$ is the word $a$.
$S_3$ are the words that do not start with $aa$.
$S_4$ are the words that start with $aa$ and end with $aa$.
$S_5$ are the words that start with $aa$ but do not end with $a$.
$S_6$ are the words that start with $aa$ and end with $a$ but not $aa$.

What kind of words can be attached to each group of words to make them in $L$?

$S_1$ + $L$
$S_2$ + words that start with $a$ and end with $aa$.
$S_3$ won't work
$S_4$ + $a$ or words that end with $aa$.
$S_5$ + words that end with $aa$.
$S_6$ + words that end with $a$.

Now that we know these completion groups of words, it is easy to find the separating words.

For example, $S_1$ and $S_2$. We need a word that is in $L$ or that starts with $a$ and ends with $aa$, but not both. The word $abaa$ will do.

For example, $S_5$ and $S_6$. We need a word that ends with $aa$ or that ends with $a$ but not both. The word $a$ will do.