Typically you would load the BC1 DDS file using LoadFromDDSFile, decompress to an RGB format using Decompress, manipulate the Image pixels, then compress using Compress, and then write the result using SaveToDDSFile.
If you want to manipulate the individually encoded blocks without decompressing the whole image, then you should just use LoadFromDDSFile and then walk the data yourself in the resulting Image. Look at the code in DirectXTexCompress.cpp for examples of working with the Image data. It's pretty simple:
// cImage is the compressed Image // Determine BC format decoder BC_DECODE pfDecode; size_t sbpp; switch(cImage.format) { case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: pfDecode = D3DXDecodeBC1; sbpp = 8; break; case DXGI_FORMAT_BC2_UNORM: case DXGI_FORMAT_BC2_UNORM_SRGB: pfDecode = D3DXDecodeBC2; sbpp = 16; break; case DXGI_FORMAT_BC3_UNORM: case DXGI_FORMAT_BC3_UNORM_SRGB: pfDecode = D3DXDecodeBC3; sbpp = 16; break; case DXGI_FORMAT_BC4_UNORM: pfDecode = D3DXDecodeBC4U; sbpp = 8; break; case DXGI_FORMAT_BC4_SNORM: pfDecode = D3DXDecodeBC4S; sbpp = 8; break; case DXGI_FORMAT_BC5_UNORM: pfDecode = D3DXDecodeBC5U; sbpp = 16; break; case DXGI_FORMAT_BC5_SNORM: pfDecode = D3DXDecodeBC5S; sbpp = 16; break; case DXGI_FORMAT_BC6H_UF16: pfDecode = D3DXDecodeBC6HU; sbpp = 16; break; case DXGI_FORMAT_BC6H_SF16: pfDecode = D3DXDecodeBC6HS; sbpp = 16; break; case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: pfDecode = D3DXDecodeBC7; sbpp = 16; break; default: return HRESULT_FROM_WIN32( ERROR_NOT_SUPPORTED ); } XMVECTOR temp[16]; const uint8_t *pSrc = cImage.pixels; for( size_t h=0; h < cImage.height; h += 4 ) { const uint8_t *sptr = pSrc; for( size_t count = 0; count < cImage.rowPitch; count += sbpp ) { pfDecode( temp, sptr ); // temp now contains the 16 pixels as XMVECTOR RGBA values for this 4x4 block sptr += sbpp; } pSrc += cImage.rowPitch; }