@rbz: Thanks, I fixed 1 & 2.

Are you sure the texture coordinates are wrong? It's definitely displaying the texture across the whole quad. I still have the problem that it's not scrolling though, and the stars are disappearing.
Edit: Well, I discovered the problem but no idea what the cause is... the starfield is rendered once correctly as I saw, but after the first frame it does in fact render the stars with their updated positions each frame. The effect I observed where the stars gradually disappeared is apparently because I wasn't clearing the texture each frame, and having drawn the stars correctly on the first frame, it then draws them black! I have no idea why it would do that, I assume something changed after the first pass through the render-to-texture section of the render loop causes it but as far as I can see everything should be reset correctly.

Here's the render loop I have now:
// Start render loop
while (!GetAsyncKeyState(VK_ESCAPE))
{
// Render geometry to offscreen surface
pDevice->BeginScene();
pDevice->SetRenderTarget(0, pSurf);
//pDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
pDevice->SetFVF(D3DFVF_VERTEX);
pDevice->SetStreamSource(0, pVertBuffer, 0, sizeof(VERTEX));
for(int i=0; i<MAX_STARS; i++)
{
D3DXMatrixTranslation(&matTranslate,stars[i].x,stars[i].y,0.0f);
pDevice->SetTransform(D3DTS_WORLD, &matTranslate);
stars[i].x += stars[i].speed;
if(stars[i].x > (float)SCREEN_WIDTH/2)
{
stars[i].x = (float)(-SCREEN_WIDTH/2);
stars[i].y = (float)((rand()%SCREEN_HEIGHT)-SCREEN_HEIGHT/2);
}
pDevice->DrawPrimitive(D3DPT_POINTLIST, (stars[i].speed)-1, 1);
}
// Render fullscreen quad
pDevice->SetRenderTarget(0, pBackBuffer);
pDevice->Clear(0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
pDevice->SetFVF(D3DFVF_QUADVERT);
pDevice->SetStreamSource(0, pQuadBuffer, 0, sizeof(QUADVERT));
pDevice->SetTransform(D3DTS_WORLD, &Identity);
pDevice->SetTexture(0,pTex);
pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
pDevice->EndScene();
pDevice->Present( NULL, NULL, NULL, NULL );
}
Uncommenting the first Clear() will result in a black screen, you can alter the colour it clears to in order to see the stars being drawn in black.