So much to say:
int* new_array = NULL; C++ uses nullptr. I.e. int* new_array = nullptr;
However, you should inlue the initialization you do next line:
int* new_array = new int[nrValues];
But you just created a new object on the heap, that you don't delete. That is called a memory leak.. Nowadays we use unique pointers to help us there.
std::unique_ptr<int[]> new_array = new int[nrValues];
However, in C++ we have STL containers handle all the C-style array stuff for you. As new_array is a different size then values, you probably want to use std::vector, which has a dynamic size. The STL containers have something called iterators, which can go over the element more efficiently. However, the STL containers don't have default output functions, so you'll have to write your own.
#include<vector>
#include<iostream>
std::vector<int> getBiggerThen(std::vector<int> const& input, int givenValue) {
    std::vector<int> output;
    for (auto it = input.cbegin(); it != input.cend(); it++) {
        if (*it > givenValue) {
            output.push_back(*it);
        }
    }
    return output;
}
std::ostream& operator<< (std::ostream& out, std::vector<int> const& vec) {
    for (auto const& el : vec) out << el << " ";
    return out;
}
int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::cout << getBiggerThen(y, 8) << "\n";
}
oh... also important: in C++ main should always return an int.
Finally, what you are doing is required so often, that the STL library has an built-in algorithm for it. Which can reduce everything to
#include<vector>
#include<algorithm>
#include<iostream>
int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::vector<int> output{};
    int givenValue = 8;
    std::copy_if(std::cbegin(y), std::cend(y), std::back_inserter(output),
        [givenValue](int val) { return val >= givenValue; });
    for (auto const& el : output) std::cout << el << " ";
    std::cout << "\n";
}