It is because the code
console.log('document from listFiles '+ documentCopyId); // print undefined
doesn't wait until this code completing
drive.files.copy({
    fileId: 'xxxx',
    resource: request,
}, (err, driveResponse) => {
    console.log('document from drive copy ' + driveResponse.data.id) //Print id
    documentCopyId = driveResponse.data.id;
});
which means that
console.log('document from listFiles '+ documentCopyId)
executing before
documentCopyId = driveResponse.data.id;
And in that case, documentCopyId is undefined.
As a solution, you can to promisify driver.files.copy part, and resolve the needed value. Or do need manipulations in a callback of drive.files.copy.
For example, you can do something like this
const listFiles = async (auth) => {
    let documentCopyId;
    const driveResponse = await copyPromise('Copy Title');
    documentCopyId = driveResponse.data.id;
    console.log('document from listFiles ' + documentCopyId);
};
const copyPromise = (name) => {
    return new Promise((resolve, reject) => {
        try {
            const drive = google.drive({ version: 'v3', auth });
            const apiKey = 'xxxxx';
            const paragraph = 'Hello World';
            let request = {
                name
            };
            drive.files.copy(
                {
                    fileId: 'xxxx',
                    resource: request,
                },
                (err, driveResponse) => {
                    if (err) throw new Error(err);
                    console.log('document from drive copy ' + driveResponse.data.id);
                    resolve(driveResponse);
                }
            );
        } catch (error) {
            console.log('Error in copyPromise:', error);
            reject(error);
        }
    });
};