Yea that is a fair assumption to make. Threads running concurrently are not necessarily running in parallel, however all threads running in parallel are also running concurrently.
Again the point the book is trying to make by distinguishing the difference between these two is that when threads are truly running in parallel, they are operating on their own private copy of the data in their cache which is then written back to main memory. Without any synchronization on the order in which cores write to main memory (Remember the compiler/cpu are allowed to re-order instructions) it is possible that one core can accidentally undo the changes another core just made. This is called a race condition and is mitigated by the use of mutual exclusion zones, aka mutexes, where only one core may operate at at time.
Early multi-core CPUs had relatively small caches which made the likelihood of accidentally stepping on another cores changes less. However today, modern i7s for example have relatively large caches and can exacerbate race conditions. Anecdotally, I once experienced this problem on code that I wrote that passed through all the testing without any problems only to crash when run on a newer core i7 cpu during deployment. I had to explain why this was happening which lead me to learn all about cpu caches and whatnot.