If your $nullAs is '\\N', then you should use $nullAs as is in concatenation of cells of $rows, but send to pgsqlCopyFromArray() escaped version. Also fifth arg $fields should be a SQL-valid string for the column_names placeholder in COPY statement of PostgreSQL.
I provide my smart wrapper for pgsqlCopyFromArray() which do this automatically.
<?php
function pgInsertByCopy (PDO $db, $tableName, array $fields, array $records) {
    static $delimiter = "\t", $nullAs = '\\N';
    $rows = [];
    foreach ($records as $record) {
        $record = array_map(
                function  ($field) use( $record, $delimiter, $nullAs) {
                    $value = array_key_exists($field, $record) ? $record[$field] : null;
                    if (is_null($value)) {
                        $value = $nullAs;
                    } elseif (is_bool($value)) {
                        $value = $value ? 't' : 'f';
                    }
                    $value = str_replace($delimiter, ' ', $value);
                    $value = addcslashes($value, "\0..\37");
                    return $value;
                }, $fields);
        $rows[] = implode($delimiter, $record) . "\n";
    }
    return $db->pgsqlCopyFromArray($tableName, $rows, $delimiter, addslashes($nullAs), implode(',', $fields));
}
?>