Multiple threads of control aren't necessarily parallelisable. Consider a language runtime for which every thread takes the same global lock on the interpreter, and therefore prevents two threads running 'simultaneously'. You have concurrency but no parallelism. Such things happen in the real world.
So you might argue that concurrency is necessary for parallelism, but it's not sufficient.
Concurrency, to me, is about expanding the set of sequentially-equivalent executions of the program which are considered 'correct' according to the operational semantics of the programming language. If you just have one correct sequential execution, then there isn't any concurrency because you would have to execute sequentially to enforce the one correct ordering.
For example, consider this snippet:
1. a = 1
2. b = 2
3. print a to file1
4. print b to file2
For most realistic language semantics there's no dependency between lines 3, and 4, so it's ok to execute in the following orders:
1, 2, 3, 4
1, 3, 2, 4
2, 1, 3, 4
2, 1, 4, 3
and others. There is concurrency there, and if the runtime cannot detect or leverage it quite often the processor will with out-of-order-execution and pipelining.
However, the simpler snippet:
1. a = 2
2. b = a * 2
3. print a + b
Doesn't have any obvious concurrency (ignoring that in this case the compiler could optimise away the assignments and additions into a single statement). 1 must happen before 2, which must happen before 3. There is only one 'correct' sequential execution, and therefore there is no obvious parallelisation achievable.