As far as I understand this helps us use vector_t to initialise an array of doubles with 10 elements.
That's not quite correct. To be precise, this typedef defines a custom type which enables one to declare an array, say, vector_t example[N]; which bona fide dimension will be N + 1 (since vector_t already assumes that a single element is itself a 1-dimensional array). Saying initialise means that you fill that memory with some data. In this particular case you may say memset(my_vec, 0, sizeof(my_vec)); to zeroise the array. If you have a simpler variable, say, int a;, then you may initialise it with, say, a = 1;.
If you declare vector_t another_example[10][10], this will actually give you a 3-dimensional array - 10 x 10 x 10.
what will happen if I use second_t? will the 2d array be Array[10][5] or Array[5][10]??
So, as you might understand from the beginning of my post, in the latter case, neither declaring second_t Array[10][5] nor second_t Array[5][10] will give a 2D array.
Actually, this will be 4-dimensional array since second_t defines a single element as being already a 2D array.
For educational purposes I suggest that you simply start with something like
#include <stdio.h>
#include <stdint.h>
typedef uint8_t vector_t[10];
in order to be able to construct more complex types, then declare arrays (say, the variable will be called array) and, finally, do something like printf("The size is %lu bytes\n", sizeof(array)); in order to see the total size in bytes. Then it will be easy to see what the total size is taking into account that the very base type is uint8_t (1 byte).