Così funziona:

codice:
#include <stdio.h>




int main()
{


    char words[30]; //dichiaro l'array principale
    char convert[30]; //array per copiare
    int i = 0; //contatore array principale
    int j = 0; //contatore array copiato


    printf("Inserisci una frase con parole divise da '.':\n");
    scanf("%s", words); //inserisco la frase


    while (words[i] != '\0')
    {
        while ((words[i] != '.') && words[i] != '\0')
        {
            convert[j] = words[i]; //passo i caratteri dall'array principale in quello del copiato fino al '.'
            ++i;
            ++j;
        }
        j--;
        while (j >= 0)
        {
            printf("%c", convert[j]); //scrivo al contrario la parola fino al punto
            --j;
        }
        printf("%c", words[i]); //stampo il punto


        if(words[i] == '\0') break;


        ++i;//incremento per passare al carattere dopo il punto
        j=0;
    }




    return 0;
}

Il problema stava nel fatto che l'ultima parola non termina con un punto, ma con il carattere '\0' (terminatore della stringa), e questo nel codice non veniva considerato.