Sequential and parallel addition of 2 vectors
#define NUM_OF_THREADS 8
#define VECTOR_SIZE    512


Don't use #define for constants or "functions" (⧺ES.31)



using time_point = std::chrono::high_resolution_clock::time_point;


Good!  bring down just the stuff you need, and give it a friendly name.  I think

using std::chrono::high_resolution_clock::time_point;


would be the same thing, and is the usual way of importing symbols from a library’s namespace.



assert(first.size() == second.size());


That will not do anything in a release build, you know.

If you really want checking, make a precondition that always works.  The GSL support library has Expects that can be programmed at compile time to assert, throw, or die.



In general operator+ looks good!  You are using a value return, and you ensure NVRO takes place.  You reserve the vector size.  You use STL algorithms.



for (int i = 1; i &lt;= VECTOR_SIZE; i++)
{
    first_vec.push_back(i);
    second_vec.push_back(i);
}


There is a standard algorithm for that.



time_point t1_seq = std::chrono::high_resolution_clock::now();
⋮


Use auto (almost everywhere).

since there is no code-movement barrier, your benchmark might not be accurate.  



for (auto &amp;thread : threads)


Good!  You use the range-for where you can.