This is an answer about how not to do it. Don't make the whole track as a single mesh.
I worked on a racing game for mobile a few years ago where the artist had faced a similar dilemma. The tracks themselves were offroad courses made with Unity's terrain feature, but each track had a barrier around it that the artist made as a single large mesh.
The problem with using a single large mesh is that the engine can't perform frustum culling. Frustum culling is when the engine skips rendering an object that is not within the camera view. This is one of the most basic ways that 3D engines are optimized for performance - there's no point in rendering anything that isn't visible on screen.
At least some part of the barrier was on-screen at all times. Because it was all a single mesh, the engine couldn't perform any frustum culling, so it was always rendering the entire barrier, which was typically several hundred thousand polygons. This was enough to severely impact framerate on low-end and mid-range mobile devices.
Another common optimization that doesn't work with large meshes is Level of Detail (LOD) models. If your entire track or barrier is one mesh, the player will always be near some part of the mesh, so you can't use lower-polygon LOD models for distant parts of the track.
Building your track, and other parts like barriers, in pieces allows you to take advantage of frustum culling and LOD models for maximum performance.
As for texturing, I think generally you create textures that cover a small section of the track and tile these across the track. Here's a very simple, sloppy example:
You may need variations for turns or to prevent the texture from looking too repetitive. Details such as skid marks and oil slicks can be added with decals as another way to prevent the road from looking repetitive.