A pointer and an array are not the same thing. While they often behave in the same way, there are major differences, one of which you have just discovered.
What your code actually does
I have substituted the typedefed type with real type, to make the explaination clearer.
float c[] = {1,1,1};
You have simply created and initialized an array
f({1,1,1});
The code above is neither a lvalue nor rvalue. The {val1,...,valn} syntax is nothing more than an initializer and can not be used elsewehere.
float* b = (float[]){1,1,1};
In here you have created and initialized an array and then stored it's location in a pointer.
f((float[]){1,1,1};
This case is the same as the one above, but instead of storing the pointer you pass it as an argument to a function.
float* a = {1,1,1};
You are attempting to write three variables to a memory location that is not allocated yet.
In general, {valn,...,valn}, is an initializer. At this moment you have nothing to initialize. Hence this syntax is invalid. You are trying to pour gas into a canister that has not yet been manufactured.
While I understand what you wanted to achieve, you seem to be missunderstanding the whole concept of memory and pointers. Imagine this code, which (in some dirty logic) is an equivalent of what you're trying to do:
float* a = NULL;
a[0] = 1;
a[1] = 1;
a[2] = 1;
What would happen if you executed this code?
So now you know why the compiler forbids it.
typedef float* vec3_tis a pointer, not an array. An array would betypedef float vec3_t[3]. Arrays are not pointers.